为什么在WPF TextBox失效时ViewModel不会更新?

时间:2011-07-12 10:25:28

标签: c# .net wpf mvvm

今天我已经查看了MSDN示例,以便对WPF TextBox输入进行验证(另请参阅:http://msdn.microsoft.com/en-us/library/ms753962.aspx)。

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

至于为什么他们决定以这种方式构建它,可能是因为他们想要在验证失败时保持一致的行为。有时视图上的值无效(例如负年龄),但可以将其写入属性。其他时候它以无法写入属性的方式无效(例如,“foo”的Age不能转换为int)。如果行为是“在可能的情况下将值写入属性”,则可能会造成混淆。

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

答案 1 :(得分:2)

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

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

另一种方法是使用单独的IsValid()方法对数据进行一些手动验证检查,如果数据有效则返回true / false。