为什么当WPF TextBox无效时,ViewModel不会被更新?

5
今天我研究了WPF TextBox输入验证的MSDN示例(参见:http://msdn.microsoft.com/en-us/library/ms753962.aspx)。
在我的应用程序中,我使用MVVM模式将视图的DataContext绑定到ViewModel上,某些TextBox绑定到ViewModel上的属性并具有特定的ValidationRules。
我发现的问题是,当值无效时,在成功验证之后,旧值将保留在ViewModel中。在我看来非常不实用,因为例如值用于命令执行。
我的确切问题也适用于给定的MSDN示例。仅在成功验证后,TextBox的值才会发送回其源。我想保留验证逻辑,但它应始终更新源。这可能吗?
提前感谢您。

尝试明确将BindingMode设置为TwoWay:http://msdn.microsoft.com/it-it/library/system.windows.data.bindingmode.aspx - Tigran
1
你想要的直接违背了机制的设计/目的。所以:不太可能。 - H H
@Tigran,感谢您的回复,但不幸的是这并没有什么区别。 - Herman Cordes
@Henk,我明白你的意思,但这会使ViewModel/DataContext中的数据过时... - Herman Cordes
@Monty:不,它可以防止使用无效数据使ViewMode失效。这是一个观点问题,你的观点是不被支持的。 - H H
2个回答

3
正如Rachel和Henk所指出的那样,这就是WPF验证规则的构建方式。如果验证失败,它不会将值写入属性。
至于为什么他们决定以这种方式构建它,可能是因为他们希望在验证失败时获得一致的行为。有时视图上的值无效(例如负年龄),但可以写入属性。其他时候,它以无法转换为int的方式无效(例如“foo”的年龄)。如果行为是“尽可能将值写入属性”,可能会让人感到困惑。
像你一样,我更喜欢每当可能更新我的ViewModel,而不管是否存在验证错误。业务对象是另一回事, 但是“Fort Knox ViewModels”对我来说似乎很奇怪,因为无效输入不仅可以接受,而且是预期的。通常在我的ViewModel中,我想知道“当前值”,而不是“最后一个有效值”。这是我不喜欢ValidationRules的原因之一。

优秀观点:“‘Fort Knox ViewModels’ 对我来说很奇怪,因为无效输入不仅可以接受,而且是预期的。” - Jay
啊,终于有人和我意见一致了!如果验证系统有某种手动覆盖功能,那将非常有用!我会查看你的博客,听起来相当有创意。与此同时,我会剥离ValidationRules! - Herman Cordes

2

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

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

另一种选择是拥有一个单独的IsValid()方法,对您的数据进行一些手动验证检查,并在数据有效或无效时返回true/false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接