任何人都可以告诉我哪种方法更适合WPF中的验证。
在性能,内存泄漏,代码可维护性和重用方面。
答案 0 :(得分:22)
这是一种复杂的请求,老实说它可能会根据偏好而不是其他任何因素而变化。但是,这是我的理解:
ValidationRules比IDataErrorInfo早(我相信后者是在.Net 3.5中引入的)。仅基于此,似乎WPF团队更喜欢IDataErrorInfo。但事实是,它们是为不同的事物而建造的。如果您有MVVM或等效模式,则IDataErrorInfo优于模型中的错误(例如,负面年龄),而ValidationRules优于视图中的错误(比如说,an)的年龄。当然可以让ValidationRules执行“业务逻辑”检查,或让IDataErrorInfo告诉你“unicode snowman不是一个有效的年龄”,但是你可能(可能)通过保持这种模式获得最佳的可维护性。
但是,除了初始测试之外,不要使用异常进行验证,以确定您应该测试的确切条件。
答案 1 :(得分:6)
使用异常进行错误处理并不是一个好主意。使用异常会降低性能。这是选择和实现IDataErrorInfo或创建ValidationRule的问题。
<强> IDataErrorInfo的强>
验证规则
我的意见是,对于必要的字段验证,电子邮件地址验证等常见验证,您可以使用验证规则。如果您需要进行范围验证等自定义验证,或使用IDataerrorinfo进行自定义验证。
答案 2 :(得分:3)
与其他两个答案中提出的观点相比,我对该主题的看法略有不同:
ValidationRule
这适用于在更新绑定源之前需要进行的验证。您可能要执行此操作的原因包括能够向用户显示特定的错误消息,尤其是与数据转换之前的值相关的消息,或验证必须转换的数据。
如其他答案中所述,在多个控件之间共享验证也更容易一些,因为您可以执行诸如创建用于多个绑定的单个ValidationRule
或使用{{1 }},以提供一个BindingGroup
,它可以一次检查多个绑定。
IDataErrorInfo 或 INotifyDataErrorInfo
这会将验证放入视图模型,适用于允许在视图模型中存储非法值的情况。可以通过此界面向用户提供特定的错误消息。
验证可用于视图模型实现的任何客户端,从而为此类验证提供更好的重用性。
重用验证规则不太方便,但绝不是不可能的。您只需要实现自己的辅助方法或对象即可根据需要执行验证。
例外
其他答案基于性能问题避开了验证例外。但是,根据我的经验,UI场景中的异常处理通常很好。尽管异常处理会产生额外的开销,但它的发生速度仍然比用户注意到的要快(尽管未经验证的“注释”)。
异常的一个重要方面是,它为您提供了在视图模型上实现错误通知接口的许多好处,同时仍可以防止在视图模型属性上设置无效值。换句话说,您可能有ValidationRule
发生得太早而ValidationRule
发生得太晚的验证场景。属性设置者抛出异常将解决这些情况。
底线:每种验证技术都有其自身的优缺点,并且适用于特定情况。没有一个可以比其他任何一个都优越。这很大程度上取决于您要执行哪种验证,以及您希望在何处看到该逻辑。