1

我正在使用 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 代码中检查它们是否为空。如果有更好的方法,我宁愿不这样做。

4

3 回答 3

1

为什么不在视图模型中使用字符串属性而不是 int 和 IDataErrorInfo 验证?在你的保存命令中,如果 IDataErrorInfo 当然没有错误,你可以安全地将你的字符串转换为你的 int 值。将字符串属性与 IDataErrorInfo 一起使用是最简单的方法。

编辑:再想一想,如果您不使用字符串属性,还有另一个问题。假设您有一个 int 属性,并且用户在您的文本框中设置了 10。所以在你的viewmodel中你有10。现在用户删除10并在你的文本框中设置一个abc。由于 bindingconversationexception,您的 viewmodel 仍然得到了 10。这就是为什么我几乎使用字符串属性。公平地说,您可以使用文本框的行为来设置掩码,这样用户就不能输入无效数据。

于 2012-05-22T14:07:57.530 回答
1

我可以马上想到两个强有力的选择。一种是绑定到 ViewModel 中的字符串属性,而该属性又被编程为仅在确定字符串有效时才解析和存储底层的“int”值。这可确保您的 TextBox 始终成功存储其数据绑定值。

第二种是拦截你的 View 中发生的 ValidationExceptions,通过自定义的 Behavior 将它们存储在你的 ViewModel 中。 本文基本上将完全按照您在问题中的描述进行。

于 2012-05-23T02:21:33.207 回答
0

您可以尝试的是BindingGroups对整个元素进行验证,而不仅仅是单个属性。例如,我将它用于我们的模态对话框来创建一个项目,其中必须在完成对话框之前设置某些设置。这个链接很好地解释了它。这个也很详细。

于 2012-05-22T10:29:47.250 回答