我正在使用 MVVM 并使用 IDataErrorInfo 完成大部分验证,并且我的 ViewModel 有一个 IsValid 属性,用于检查每个需要验证的成员的有效性。但是我有几个文本框绑定到不能为空的整数,所以我使用 ValidationRule 来提醒用户(使用比“无法转换值”更友好的消息)如果他们空白该字段显然,属性设置器永远不会被调用,因此不会调用 IDataErrorInfo 代码。
问题是我有一个保存按钮(这是一个 RelayCommand),如果有任何验证错误,我想禁用它。因此,该命令的 CanExecute 会检查 VM 的 IsValid 属性。但显然,如果用户将我的 int 字段置空,则 IDataErrorInfo 对此一无所知,并且当前该按钮不会被禁用。有没有办法让 ViewModel 检测到该错误?
我以为我在这里找到了解决方案 http://wpfglue.wordpress.com/2009/12/03/forwarding-the-result-of-wpf-validation-in-mvvm/ 但是已经将它翻译成 C# 我可以'让它工作(从未调用强制回调)。我还不太了解依赖属性和对象(对 WPF 来说非常新),这个解决方案对我来说看起来很复杂。
我唯一能想到的就是摆脱验证规则并制作一个可为空的 int 包装器,将 TargetNullValue='' 放入绑定中,然后我可以在 IDataErrorInfo 代码中检查它们是否为空。如果有更好的方法,我宁愿不这样做。