我有一个非常简单的WPF应用程序,其中使用了数据绑定以允许编辑某些自定义CLR对象。现在,我想在用户单击保存时添加一些输入验证。但是,我读过的所有WPF书籍都没有真正花任何时间解决这个问题。我看到您可以创建自定义的ValidationRules,但是我想知道这是否对我的需求来说是过大的。
所以我的问题是:在某处是否有一个好的示例应用程序或文章展示了验证WPF中用户输入的最佳实践?
我有一个非常简单的WPF应用程序,其中使用了数据绑定以允许编辑某些自定义CLR对象。现在,我想在用户单击保存时添加一些输入验证。但是,我读过的所有WPF书籍都没有真正花任何时间解决这个问题。我看到您可以创建自定义的ValidationRules,但是我想知道这是否对我的需求来说是过大的。
所以我的问题是:在某处是否有一个好的示例应用程序或文章展示了验证WPF中用户输入的最佳实践?
Answers:
从MS的模式和实践文档中:
数据验证和错误报告
通常会需要您的视图模型或模型来执行数据验证并将任何数据验证错误通知给视图,以便用户可以采取行动来纠正它们。
Silverlight和WPF提供支持,用于管理更改绑定到视图中控件的单个属性时发生的数据验证错误。对于数据绑定到控件的单个属性,视图模型或模型可以通过拒绝传入的错误值并引发异常来指示属性设置器内的数据验证错误。如果数据绑定上的ValidatesOnExceptions属性为true,则WPF和Silverlight中的数据绑定引擎将处理该异常并向用户直观地提示存在数据验证错误。
但是,应尽可能避免以这种方式抛出带有属性的异常。另一种方法是在视图模型或模型类上实现IDataErrorInfo或INotifyDataErrorInfo接口。这些接口允许您的视图模型或模型对一个或多个属性值执行数据验证,并向视图返回错误消息,以便可以将错误通知用户。
该文档继续说明了如何实现IDataErrorInfo和INotifyDataErrorInfo。
个人而言,我正在使用异常来处理验证。它需要执行以下步骤:
这里的技巧是仅绑定到从DependencyObject派生的对象。INotifyPropertyChanged的简单实现不起作用-框架中存在一个错误,该错误阻止您访问错误集合。
您可能对WPF应用程序框架(WAF)的BookLibrary示例应用程序感兴趣。它显示了如何在WPF中使用验证以及存在验证错误时如何控制“保存”按钮。
如果您的UI直接使用您的业务类,则最好使用IDataErrorInfo,因为它使逻辑更接近其所有者。
如果您的业务类是由对WCF / XmlWeb服务的引用创建的存根类,则您不能/必须不使用IDataErrorInfo或将Exception抛出以与ExceptionValidationRule一起使用。相反,您可以: