WPF数据绑定和验证规则最佳实践

Mar*_*ath 100 .net data-binding validation wpf

我有一个非常简单的WPF应用程序,我在其中使用数据绑定来允许编辑一些自定义CLR对象.我现在想要在用户单击保存时输入一些输入验证.但是,我读过的所有WPF书籍并没有真正为这个问题投入任何空间.我看到你可以创建自定义ValidationRules,但我想知道这对我的需求是否有点过分.

所以我的问题是:是否有一个很好的示例应用程序或文章,它演示了在WPF中验证用户输入的最佳实践?

rud*_*ler 83

我认为新的首选方式可能是使用IDataErrorInfo

在这里阅读更多

  • 我还发现了Cinch框架(http://cinch.codeplex.com/),其中包含WPF + MVVM中最佳实践验证的演示,并使用了IDataErrorInfo (3认同)
  • 在.NET 4.5中,您可以使用INotifyErrorInfo,它允许您返回对象而不仅仅是字符串. (2认同)

Pat*_*Pat 23

从MS的模式和实践文档:

数据验证和错误报告

通常需要您的视图模型或模型来执行数据验证并向视图发出任何数据验证错误信号,以便用户可以采取行动纠正它们.

Silverlight和WPF支持管理更改绑定到视图中控件的各个属性时发生的数据验证错误.对于与控件数据绑定的单个属性,视图模型或模型可以通过拒绝传入的错误值并抛出异常来表示属性设置器中的数据验证错误.如果数据绑定上的ValidatesOnExceptions属性为true,则WPF和Silverlight中的数据绑定引擎将处理该异常并向用户显示存在数据验证错误的可视提示.

但是,应尽可能避免以这种方式抛出属性异常.另一种方法是在视图模型或模型类上实现IDataErrorInfo或INotifyDataErrorInfo接口.这些接口允许您的视图模型或模型对一个或多个属性值执行数据验证,并向视图返回错误消息,以便可以通知用户错误.

文档继续解释如何实现IDataErrorInfo和INotifyDataErrorInfo.

  • 还应该注意的是,微软的一些muppet决定不在.net4中包含INotifyDataErrorInfo但仅限于Silverlight.它很痛苦.. (22认同)
  • @ al3891-这将在.NET 4.5中排序 - http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(v=vs.110).aspx (4认同)
  • 当我看到抛出异常推荐时,我起初很担心.很高兴看到随后"尽可能避免以这种方式抛出属性异常" (3认同)

Gre*_*reg 10

personaly,我正在使用例外来处理验证.它需要以下步骤:

  1. 在您的数据绑定表达式中,您需要添加"ValidatesOnException = True"
  2. 在您绑定的数据对象中,您需要添加DependencyPropertyChanged处理程序,在其中检查新值是否满足您的条件 - 如果不是 - 您还原到对象旧值(如果需要)并抛出异常.
  3. 在用于在控件中显示无效值的控件模板中,您可以访问错误集合并显示异常消息.

这里的技巧是仅绑定从DependencyObject派生的对象.INotifyPropertyChanged的简单实现不起作用 - 框架中存在一个错误,阻止您访问错误集合.