Wpf IDataErrorInfo vs ValidationRule vs Exception
谁能告诉我在WPF中哪种验证方法更好Wpf IDataErrorInfo vs ValidationRule vs Exception,wpf,idataerrorinfo,Wpf,Idataerrorinfo,谁能告诉我在WPF中哪种验证方法更好 实现IDataErrorInfo 创建ValidationRule 抛出异常 在性能、内存泄漏、代码可维护性和重用方面。这是一种复杂的请求,老实说,它可能会根据偏好而变化,而不是其他任何东西。但是,我的理解是: 性能:除非您的其他实现非常糟糕,否则异常几乎每次都会丢失。投掷/接球周期的开销很大。(轶事:我有一个“必须是数字”的检查,这是一个例外,当它失败时,它“滞后”UI一段明显的时间,但当转换为ValidationRule时,它实际上是即时的。) 内存泄
在性能、内存泄漏、代码可维护性和重用方面。这是一种复杂的请求,老实说,它可能会根据偏好而变化,而不是其他任何东西。但是,我的理解是:
- 性能:除非您的其他实现非常糟糕,否则异常几乎每次都会丢失。投掷/接球周期的开销很大。(轶事:我有一个“必须是数字”的检查,这是一个例外,当它失败时,它“滞后”UI一段明显的时间,但当转换为ValidationRule时,它实际上是即时的。)
- 内存泄漏:这取决于验证规则或IDataErrorInfo实现的执行方式
- 代码可维护性、重用性:这当然是有趣的部分。您真正应该问的是“何时使用ValidationRule而不是IDataErrorInfo合适,反之亦然?”
但是,在初始测试之后,不要使用异常进行验证,以查看您应该测试的确切条件。使用异常进行错误处理不是一个好主意。使用异常会降低性能。这是一个选择和实现IDataErrorInfo或创建ValidationRule的问题 IDataErrorInfo
- 验证逻辑保持在视图模型中,易于实现和维护
- 对viewmodel中所有字段的完全控制
- 在单独的类中维护验证规则
- 增加可重用性。例如,您可以实现必填字段 验证类在整个应用程序中重用它
我的意见是,对于常见的验证,如必填字段验证、电子邮件地址验证,您可以使用验证规则。如果您需要进行自定义验证,如范围验证或任何自定义验证,请使用IDataerrorinfo。我对该主题的看法与其他两个答案中的观点略有不同: 验证规则
- 这适用于需要在更新绑定源之前进行的验证。这样做的原因可能包括能够向用户显示特定的错误消息,特别是与数据转换前的值相关的消息,或者验证必须转换的数据
- 正如其他答案中所指出的,在多个控件之间共享验证也比较容易,因为您可以创建一个用于多个绑定的
,或者使用ValidationRule
提供一个一次检查多个绑定的BindingGroup
ValidationRule
- 这将验证放入视图模型中,适用于允许在视图模型中存储非法值的场景。可以通过此界面向用户提供特定的错误消息
- 验证可用于视图模型实现的任何客户端,从而为此类验证提供更好的重用
- 重复使用验证规则有点不太方便,但无论如何都不是不可能的。您只需要实现自己的帮助器方法或对象即可执行验证
- 另一个答案是基于性能考虑避免验证异常。然而,根据我的经验,UI场景中的异常处理一般都很好。尽管异常处理会带来额外的开销,但发生的速度仍然比用户能够注意到的要快(尽管有未经验证的“轶事”)
- 异常的一个重要方面是,它为您提供了在视图模型上实现错误通知接口的许多好处,同时仍然可以防止在视图模型属性上设置无效值。换句话说,您可能会遇到
发生得太早和ValidationRule
发生得太晚了。从属性设置器引发异常可以解决这些情况IDa的验证场景taErrorInfo
一句话:每种验证技术都有自己的优缺点,适用于特定的场景。没有一种技术比其他任何技术都更优越。这在很大程度上取决于您尝试进行哪种验证,以及您希望在何处执行该逻辑。今天阅读了IDataErrorInfo-似乎它比Validate更早ionRule—看起来IDataErrorInfo接口从Framework 1.1()开始就存在了但是ValidationRule是从Framework 3.0开始的。尽管在我看来ValidationRule甚至可以在设置属性之前拦截绑定过程并执行验证,但不要认为它会从根本上改变您的答案。而IDataErrorInfo或INotifyDataErrorInfo要求成功设置属性(通过