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

.net WPF数据绑定和验证规则最佳实践,.net,wpf,data-binding,validation,.net,Wpf,Data Binding,Validation,我有一个非常简单的WPF应用程序,其中我使用数据绑定来允许编辑一些自定义CLR对象。我现在想在用户单击save时进行一些输入验证。然而,我读过的所有WPF书籍都没有真正为这个问题留出任何空间。我知道您可以创建自定义的ValidationRules,但我想知道这对于我的需求来说是否过于苛刻了 因此,我的问题是:是否有一个好的示例应用程序或文章可以演示在WPF中验证用户输入的最佳实践?我认为新的首选方法可能是使用IDataErrorInfo 阅读更多内容同时检查。据推测,微软发布了他们的模式和实践,

我有一个非常简单的WPF应用程序,其中我使用数据绑定来允许编辑一些自定义CLR对象。我现在想在用户单击save时进行一些输入验证。然而,我读过的所有WPF书籍都没有真正为这个问题留出任何空间。我知道您可以创建自定义的ValidationRules,但我想知道这对于我的需求来说是否过于苛刻了


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

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


阅读更多内容

同时检查。据推测,微软发布了他们的模式和实践,其中涵盖了验证主题,但天知道为什么他们没有包括WPF的验证,所以我要告诉你的博客文章解释了作者是如何修改它的。希望这有帮助

就个人而言,我使用异常来处理验证。它需要以下步骤:

  • 在数据绑定表达式中,需要添加“ValidatesOnException=True”
  • 在要绑定到的数据对象中,需要添加DependencyPropertyChanged处理程序,在该处理程序中检查新值是否满足条件-如果不满足,则恢复到对象旧值(如果需要),并引发异常
  • 在用于显示控件中无效值的控件模板中,可以访问错误集合并显示异常消息

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

    您可能对BookLibrary示例应用程序感兴趣。它显示了如何在WPF中使用验证,以及在存在验证错误时如何控制“保存”按钮。

    来自MS:

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

    Silverlight和WPF提供支持 用于管理数据验证错误 当改变个体时会发生这种情况 绑定到控件的属性 在视图中。对于单一属性 是绑定到控件的数据 视图模型或模型可以向数据发送信号 属性中的验证错误 通过拒绝传入的坏消息来设置setter 值并引发异常。如果 上的ValidatesOnExceptions属性 数据绑定是真的,数据 WPF和Silverlight中的绑定引擎 将处理异常并显示 一种视觉提示,提示用户存在 数据验证错误

    但是,抛出异常 这样的属性应该是 尽可能避免。替代方案 方法是实施 IDataErrorInfo或INotifyDataErrorInfo 视图模型或模型上的接口 上课。这些接口允许您的 查看模型或要执行数据的模型 验证一个或多个属性 值并返回错误消息 添加到视图中,以便用户可以 已通知错误


    文档接着解释了如何实现IDataErrorInfo和INotifyDataErrorInfo。

    如果您的UI直接使用您的业务类,则更倾向于使用IDataErrorInfo,因为它使逻辑更接近其所有者

    如果您的业务类是通过引用WCF/XmlWeb服务创建的存根类,那么您不能/不得使用IDataErrorInfo,也不能将Exception与ExceptionValidationRule一起使用。相反,您可以:

    • 使用自定义验证规则
    • 在WPF UI项目中定义一个分部类并实现IDataErrorInfo

    我还发现了Cinch framework(),其中包括WPF+MVVM中最佳实践验证的演示,并使用IDataErrorFoin.NET 4.5。您可以使用INotifyErrorInfo,它允许您返回对象而不仅仅是字符串。一开始,当我看到抛出异常建议时,我很担心。很高兴看到“尽可能避免以这种方式引发属性异常”,还应该注意的是,microsoft的一些木偶决定不在.net4中包含INotifyDataErrorInfo,而只在silverlight中包含。这很痛苦。@al3891-这将在.NET 4.5中进行排序-@al3891是否有其他方法可以替代丢失的INotifyDataErrorInfo?我知道这很旧,但我希望Alex能够做出回应。这也是我得出的结论,但问题是您必须为(例如)ValidationRule中不能大于100的“Age”属性编写一些验证,然后在IDataErrorInfo接口中重复相同的逻辑,从而复制该逻辑。有什么办法吗?你在哪里复制逻辑?在某种服务器验证中?根据您的评论,我猜您正在UI中使用IDataErrorInfo进行验证,并在业务对象中复制验证,不是吗?如果是这样的话,那么在双方都进行验证是正确的。业务对象不能信任UI,必须执行自己的验证(尽管它似乎是重复的)否,验证逻辑的重复在IDataErrorInfo和自定义验证规则中。。。由于自定义验证规则是在数据实际更新到绑定对象之前验证数据的唯一方法,因此需要在IDataErrorInfo中定义该验证(年龄必须小于100)以返回“每个字段”消息,但也必须在自定义验证规则中实现。有道理吗?