我有一个非常简单的WPF应用程序,我在其中使用数据绑定来允许编辑一些自定义CLR对象 . 我现在想要在用户单击保存时输入一些输入验证 . 但是,我读过的所有WPF书籍并没有真正为这个问题投入任何空间 . 我看到你可以创建自定义ValidationRules,但我想知道这对我的需求是否有点过分 .
所以我的问题是:是否有一个很好的示例应用程序或文章,它演示了在WPF中验证用户输入的最佳实践?
我认为新的首选方式可能是使用IDataErrorInfo
阅读更多here
来自MS的Patterns & Practices documentation:
数据验证和错误报告通常需要您的视图模型或模型来执行数据验证并向视图发出任何数据验证错误信号,以便用户可以采取行动纠正它们 . Silverlight和WPF支持管理更改绑定到视图中控件的各个属性时发生的数据验证错误 . 对于与控件数据绑定的单个属性,视图模型或模型可以通过拒绝传入的错误值并抛出异常来表示属性设置器中的数据验证错误 . 如果数据绑定上的ValidatesOnExceptions属性为true,则WPF和Silverlight中的数据绑定引擎将处理该异常并向用户显示存在数据验证错误的可视提示 . 但是,应尽可能避免以这种方式抛出属性异常 . 另一种方法是在视图模型或模型类上实现IDataErrorInfo或INotifyDataErrorInfo接口 . 这些接口允许您的视图模型或模型对一个或多个属性值执行数据验证,并向视图返回错误消息,以便可以通知用户错误 .
文档继续解释如何实现IDataErrorInfo和INotifyDataErrorInfo .
personaly,我正在使用例外来处理验证 . 它需要以下步骤:
这里的技巧是仅绑定从DependencyObject派生的对象 . INotifyPropertyChanged的简单实现不起作用 - 框架中存在一个错误,阻止您访问错误集合 .
另请检查this article . 据推测,微软从他们的模式和实践中发布了他们的Enterprise Library (v4.0),涵盖了验证主题,但上帝知道为什么他们没有指导你,解释作者做了什么来适应它 . 希望这可以帮助!
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用程序感兴趣 . 它显示了如何在WPF中使用验证以及如何在存在验证错误时控制“保存”按钮 .
如果您的业务类直接由您的UI使用,则最好使用IDataErrorInfo,因为它使逻辑更接近其所有者 .
如果您的业务类是通过引用WCF / XmlWeb服务创建的存根类,那么您不能/不能使用IDataErrorInfo,也不能抛出Exception以与ExceptionValidationRule一起使用 . 相反,你可以:
使用自定义ValidationRule .
在WPF UI项目中定义部分类并实现IDataErrorInfo .
6 回答
我认为新的首选方式可能是使用IDataErrorInfo
阅读更多here
来自MS的Patterns & Practices documentation:
文档继续解释如何实现IDataErrorInfo和INotifyDataErrorInfo .
personaly,我正在使用例外来处理验证 . 它需要以下步骤:
在您绑定的数据对象中
在用于在控件中显示无效值的控件模板中
这里的技巧是仅绑定从DependencyObject派生的对象 . INotifyPropertyChanged的简单实现不起作用 - 框架中存在一个错误,阻止您访问错误集合 .
另请检查this article . 据推测,微软从他们的模式和实践中发布了他们的Enterprise Library (v4.0),涵盖了验证主题,但上帝知道为什么他们没有指导你,解释作者做了什么来适应它 . 希望这可以帮助!
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用程序感兴趣 . 它显示了如何在WPF中使用验证以及如何在存在验证错误时控制“保存”按钮 .
如果您的业务类直接由您的UI使用,则最好使用IDataErrorInfo,因为它使逻辑更接近其所有者 .
如果您的业务类是通过引用WCF / XmlWeb服务创建的存根类,那么您不能/不能使用IDataErrorInfo,也不能抛出Exception以与ExceptionValidationRule一起使用 . 相反,你可以:
使用自定义ValidationRule .
在WPF UI项目中定义部分类并实现IDataErrorInfo .