Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf IDataErrorInfo vs ValidationRule vs Exception_Wpf_Idataerrorinfo - Fatal编程技术网

Wpf IDataErrorInfo vs ValidationRule vs Exception

Wpf IDataErrorInfo vs ValidationRule vs Exception,wpf,idataerrorinfo,Wpf,Idataerrorinfo,谁能告诉我在WPF中哪种验证方法更好 实现IDataErrorInfo 创建ValidationRule 抛出异常 在性能、内存泄漏、代码可维护性和重用方面。这是一种复杂的请求,老实说,它可能会根据偏好而变化,而不是其他任何东西。但是,我的理解是: 性能:除非您的其他实现非常糟糕,否则异常几乎每次都会丢失。投掷/接球周期的开销很大。(轶事:我有一个“必须是数字”的检查,这是一个例外,当它失败时,它“滞后”UI一段明显的时间,但当转换为ValidationRule时,它实际上是即时的。) 内存泄

谁能告诉我在WPF中哪种验证方法更好

  • 实现IDataErrorInfo
  • 创建ValidationRule
  • 抛出异常

  • 在性能、内存泄漏、代码可维护性和重用方面。

    这是一种复杂的请求,老实说,它可能会根据偏好而变化,而不是其他任何东西。但是,我的理解是:

    • 性能:除非您的其他实现非常糟糕,否则异常几乎每次都会丢失。投掷/接球周期的开销很大。(轶事:我有一个“必须是数字”的检查,这是一个例外,当它失败时,它“滞后”UI一段明显的时间,但当转换为ValidationRule时,它实际上是即时的。)
    • 内存泄漏:这取决于验证规则或IDataErrorInfo实现的执行方式
    • 代码可维护性、重用性:这当然是有趣的部分。您真正应该问的是“何时使用ValidationRule而不是IDataErrorInfo合适,反之亦然?”
    ValidationRules比IDataErrorInfo更早(我相信后者是在.NET3.5中引入的)。仅基于此,WPF团队似乎更喜欢IDataErrorInfo。但事实是,它们是为不同的东西而建造的。如果您有MVVM或等效模式,IDataErrorInfo对于模型中的错误(例如,负年龄)更为优越,而ValidationRules对于视图中的错误(例如,负年龄)更为优越☃). 当然,有可能让ValidationRules执行“业务逻辑”检查,或者让IDataErrorInfo告诉您“unicode雪人不是有效年龄”,但您(可能)会通过保持这种模式获得最佳的可维护性


    但是,在初始测试之后,不要使用异常进行验证,以查看您应该测试的确切条件。

    使用异常进行错误处理不是一个好主意。使用异常会降低性能。这是一个选择和实现IDataErrorInfo或创建ValidationRule的问题

    IDataErrorInfo

    • 验证逻辑保持在视图模型中,易于实现和维护
    • 对viewmodel中所有字段的完全控制
    验证规则

    • 在单独的类中维护验证规则
    • 增加可重用性。例如,您可以实现必填字段 验证类在整个应用程序中重用它

    我的意见是,对于常见的验证,如必填字段验证、电子邮件地址验证,您可以使用验证规则。如果您需要进行自定义验证,如范围验证或任何自定义验证,请使用IDataerrorinfo。

    我对该主题的看法与其他两个答案中的观点略有不同:

    验证规则

    • 这适用于需要在更新绑定源之前进行的验证。这样做的原因可能包括能够向用户显示特定的错误消息,特别是与数据转换前的值相关的消息,或者验证必须转换的数据

    • 正如其他答案中所指出的,在多个控件之间共享验证也比较容易,因为您可以创建一个用于多个绑定的
      ValidationRule
      ,或者使用
      BindingGroup
      提供一个一次检查多个绑定的
      ValidationRule

    IDataErrorInfoINotifyDataErrorInfo

    • 这将验证放入视图模型中,适用于允许在视图模型中存储非法值的场景。可以通过此界面向用户提供特定的错误消息

    • 验证可用于视图模型实现的任何客户端,从而为此类验证提供更好的重用

    • 重复使用验证规则有点不太方便,但无论如何都不是不可能的。您只需要实现自己的帮助器方法或对象即可执行验证

    例外情况

    • 另一个答案是基于性能考虑避免验证异常。然而,根据我的经验,UI场景中的异常处理一般都很好。尽管异常处理会带来额外的开销,但发生的速度仍然比用户能够注意到的要快(尽管有未经验证的“轶事”)

    • 异常的一个重要方面是,它为您提供了在视图模型上实现错误通知接口的许多好处,同时仍然可以防止在视图模型属性上设置无效值。换句话说,您可能会遇到
      ValidationRule
      发生得太早和
      IDa的验证场景taErrorInfo
      发生得太晚了。从属性设置器引发异常可以解决这些情况


    一句话:每种验证技术都有自己的优缺点,适用于特定的场景。没有一种技术比其他任何技术都更优越。这在很大程度上取决于您尝试进行哪种验证,以及您希望在何处执行该逻辑。

    今天阅读了IDataErrorInfo-似乎它比Validate更早ionRule—看起来IDataErrorInfo接口从Framework 1.1()开始就存在了但是ValidationRule是从Framework 3.0开始的。尽管在我看来ValidationRule甚至可以在设置属性之前拦截绑定过程并执行验证,但不要认为它会从根本上改变您的答案。而IDataErrorInfo或INotifyDataErrorInfo要求成功设置属性(通过