我陷入了一个看似常见的需求中。我有一个WPF Prism(用于MVVM)应用程序。我的模型实现了IDataErrorInfo用于验证。IDataErrorInfo对于非数值属性非常有效。然而,对于数值属性,如果用户输入了无效字符(非数值),那么数据甚至不会到达模型,因为wpf无法将其转换为数值类型。
因此,我不得不使用WPF ValidationRule来为用户提供一些有意义的消息,用于无效的数字条目。视图中的所有按钮都绑定到prism的DelegateCommand(在视图模型中),按钮的启用/禁用在视图模型本身中完成。
现在,如果某个文本框的wpf ValidationRule失败,我如何将此信息传递给视图模型,以便它可以适当地禁用视图中的按钮?
9条答案
按热度按时间bqjvbblv1#
对于MVVM,我更喜欢使用Attached Properties来处理这类事情,因为它们是可重用的,并且可以保持视图模型的整洁。
为了将Validation.HasError属性绑定到视图模型,必须创建一个附加属性,该属性具有一个CoergeValueCallback,用于将附加属性的值与验证用户输入的控件上的Validation.HasError属性同步。
This文章解释了如何使用此技术来解决通知视图模型WPF ValidationRule错误的问题。代码是在VB中编写的,所以如果您不是VB用户,我将其移植到C#中。
附属财产
在XAML中使用附加属性
现在,视图模型上的属性将与文本框上的Validation.HasError同步。
1bqhqjot2#
尼尔万
解决这个问题最简单的方法是使用一个numeric textbox,它可以防止用户输入无效值(您可以通过第三方供应商来实现这一点,或者找到一个开源解决方案,比如从Textbox派生的类,它可以禁止非数字输入)。
在MVVM中处理这个问题的第二种方法是在ViewModel中定义另一个字符串字段,并将该字段绑定到文本框,然后在字符串字段的setter中设置Integer,并为数值字段赋值:
下面是一个粗略的例子:(注意,我没有测试它,但它应该给予你的想法)
s6fujrry3#
从.NET 4.5开始,ValidationRule具有Validate方法的重载:
您可以覆盖它并通过以下方式获得视图模型:
sqserrrh4#
我和你有同样的问题,但是我用另一种方法解决,我用触发器在输入无效时禁用按钮。同时,文本框绑定应该使用
ValidatesOnExceptions=true
b1zrtrql5#
您必须根据绑定类型属性指定自定义用户控件。例如,如果您的属性是int类型,则必须放置不允许除integer类型之外的其他值的控件。
您可以放入PreviewTextInput=“数字验证文本框”中的逻辑。
只要插入您逻辑或放置custome控件,您就完成了。
默认情况下也必须实现mvvm验证。
ztmd8pv56#
1.根据绑定属性的逻辑在模型或视图模型中实现
IDataErrorInfo
。您可以在这两个类中实现。1.在你的基本验证类中也实现这个。当绑定
IDataErrorInfo
不起作用时,验证将在这里触发。1.接下来,添加全局类
1.克萨姆勒
l3zydbqr7#
如果您提供了一个自定义的
ValidationRule
实现,您可以存储它接收到的值,以及存储最后的结果。伪代码:wbgh16ku8#
有人在这里解决了这个问题(不幸的是它是在VB中),在VM中创建了一个依赖属性HasError,它似乎绑定到Validation.HasError。我还没有完全理解它,但它可能会帮助你:
http://wpfglue.wordpress.com/2009/12/03/forwarding-the-result-of-wpf-validation-in-mvvm/
hyrbngr79#
我遇到了同样的问题,并解决了它与一个技巧。见下面的转换器: