【问题标题】:Why does the ViewModel not get updated when WPF TextBox is invalidated?为什么当 WPF TextBox 失效时 ViewModel 没有更新?
【发布时间】:2011-07-12 10:25:28
【问题描述】:

今天我研究了 MSDN 示例以验证 WPF 文本框输入(另请参阅:http://msdn.microsoft.com/en-us/library/ms753962.aspx)。

在我自己的应用程序中,我使用 MVVM 模式将视图的 DataContext 绑定到 ViewModel。某些 TextBox 数据绑定到 ViewModel 上的属性,并具有特定的 ValidationRules。

我发现当一个值失效时,在它之前成功验证后,旧值将保留在 ViewModel 中。在我看来非常没用,因为值用于例如命令执行。

我的这个确切问题也适用于给定的 MSDN 示例。 TextBox 的值仅在成功验证后才会发送回其源。我想保留验证逻辑,但它应该始终更新源。这可能吗?

提前致谢。

【问题讨论】:

  • 尝试将 BindingMode 设置为 TwoWay:msdn.microsoft.com/it-it/library/…
  • 你想要什么直接违背了机制的设计/目的。所以:不太可能。
  • @Tigran,感谢您的回复,但不幸的是,这并没有什么不同。
  • @Henk,明白你在指出这一点,但它会给 ViewModel/DataContext 留下过时的数据......
  • @Monty:不,它可以防止使用无效数据使 ViewMode 失效。这是观点问题,不支持您的观点。

标签: c# .net wpf mvvm


【解决方案1】:

正如 Rachel 和 Henk 所指出的,这就是 WPF 验证规则的构建方式。如果验证失败,它不会将值写入属性。

至于他们决定以这种方式构建它的原因,可能是因为他们希望在验证失败时保持一致的行为。有时视图上的值无效(例如负年龄),但可以将其写入属性。其他时候,它以不可能写入属性的方式无效(例如,“foo”的年龄不能转换为 int)。如果行为是“如果可能,将值写入属性”可能会令人困惑。

和你一样,如果我的 ViewModel 尽可能得到更新,我会更喜欢它,而不管验证错误如何。 Business objects are a different matter,但“Fort Knox ViewModels”对我来说似乎很奇怪,因为无效输入不仅没问题,而且是预期。通常在我的 ViewModel 中,我想知道“当前值”,而不是“最后一个有效值”。这是我不喜欢 ValidationRules 的原因之一。

【讨论】:

  • 优点:“'Fort Knox ViewModels' 对我来说似乎很奇怪,因为无效的输入不仅没问题,而且是意料之中的。”
  • 啊,至少有人同意我的观点!如果验证系统有某种手动覆盖,那将很有用!我会看看你的博客,听起来很有创意。同时,我将去掉 ValidationRules!
【解决方案2】:

验证是为了确保输入的数据对指定的属性有效。如果数据无效,则不应将其存储在属性中。

例如,如果有人在绑定到 Integer 字段的 TextBox 中键入一个字母,则应用程序不应尝试将该字符放入 int 中,因为会引发异常。

另一种方法是使用单独的IsValid() 方法对您的数据进行一些手动验证检查,并在数据有效与否时返回真/假。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多