2012-05-22 61 views
1

我正在使用MVVM,并且使用IDataErrorInfo进行了大部分验证,并且我的ViewModel具有一个IsValid属性,该属性检查需要验证的每个成员的有效性。然而,我有几个绑定到整数不能为空的文本框,所以我使用ValidationRule来提醒用户(用比“无法转换的值”更友好的消息),如果他们空白该字段显然,属性设置器永远不会被调用,所以IDataErrorInfo代码不会被调用。MVVM检测视图模型中的Validation.HasError

问题是我有一个保存按钮(这是一个RelayCommand),我想要禁用,如果有任何验证错误。因此该命令的CanExecute会检查VM的IsValid属性。但显然,如果用户空白我的int字段IDataErrorInfo对此一无所知,并且当前按钮不会被禁用。有没有一种ViewModel可以检测到错误的方法?

我想我在这里找到 http://wpfglue.wordpress.com/2009/12/03/forwarding-the-result-of-wpf-validation-in-mvvm/ 一个解决方案,但有它翻译成C#我无法得到它的工作(在强制回调永远不会被调用)。我不太了解依赖项属性和对象(对WPF来说很新),这个解决方案对我来说看起来很复杂。

我唯一能想到的就是摆脱验证规则,并创建一个可为null的int包装器,将TargetNullValue =''放入绑定中,然后在IDataErrorInfo代码中检查它们是否为null。如果有更好的方法,我宁愿不这样做。

+1

嗨,我写了你引用的博客文章。如果你发布C#代码,我可能会告诉你它有什么问题。 – hbarck

回答

1

为什么不使用字符串属性而不是int在你的viewmodel中使用IDataErrorInfo验证?在你的save命令中,如果IDataErrorInfo没有错误,你可以安全地将你的字符串转换为你的int值。在IDataErrorInfo中使用字符串属性是最简单的方法。

编辑:还有一个想法,如果你不使用字符串属性还有另一个问题。假设你有一个int Property,并且用户在你的文本框中设置了10。所以在你的viewmodel中你有10个。现在用户删除10并在你的文本框中设置abc。你的视图模型仍然得到了10.因为绑定关系的错误。这就是为什么我几乎使用字符串属性。公平地说,你可以使用文本框的行为来设置掩码,所以用户不能输入无效数据。

+0

我是继承文本框只接受数字,但我需要处理空白,所以已经改变我的int属性为可空int(这是一个类似原则的字符串 - 即让属性设置器触发,并有IDataErrorInfo处理它)。我以这种方式来这样做,因为它似乎是最简单的,在一个地方做验证似乎更好。 – Nix

+1

其更容易或更优雅的使用行为,而不是继承:) – blindmeis

0

你可以尝试的是BindingGroups并且对整个元素进行验证,而不仅仅是单个属性。例如,我使用这个模式对话框创建一个项目,在完成对话框之前必须设置某些设置。这link详细解释它。 This一个也很详细。

+0

对不起,但我无法看到任何涉及从ViewModel禁用命令的链接。 – Nix

+0

@Nix多种方式,我们在视图模型上使用bool属性,该属性指示是否存在错误,在实际验证步骤(适用于BindingGroups和简单的IDataErrorInfo验证)上设置,并在其上绑定提交按钮的IsEnabled属性。或者您可以注册此属性的更改并激发底层路由命令的CanExecutedChanged事件。也许你可以直接绑定到绑定组内的属性。 – dowhilefor

1

我可以马上想到两个强大的选项。一种是绑定到你的ViewModel中的一个字符串属性,而该属性又被编程为仅在字符串被确定为有效时解析并存储基础的'int'值。这确保您的TextBox将始终成功存储其数据绑定值。

第二个是拦截View中发生的ValidationException,并通过自定义行为将它们存储在ViewModel中。 This article将基本上按照您在问题中描述的方式进行。

+0

第二个答案看起来很有趣,但我相信我需要下载ExpressionBlend,这是一个不容错过。我结束了我最初所说的做法,即使用可为空的int属性,因为我的文本框都是数字。当他/她首先用字符串包装器达到那里时,让它盲目投票,这是相同的原则,但是要感谢回答。 – Nix

+0

我的荣幸。为了清楚起见,您不需要行为功能的混合;它包装在(免费)Blend SDK中,这是一个相当标准的WPF应用程序SDK。 http://www.microsoft.com/en-us/download/details.aspx?id=10801 – BTownTKD