使用 IDataErrorInfo 和 INotifyPropertyChanged 验证自定义数据类型
本文关键字:定义数据类型 验证 INotifyPropertyChanged IDataErrorInfo 使用 | 更新日期: 2023-09-27 18:32:25
我有一个保存数据的对象的模型,该模型绑定到输入表单。此模型使用IDataErrorInfo
和INotifyPropertyChanged
来验证其内容。我有一种将像"(6*20+sin(20))"
这样的字符串转换为double
值的方法。用于输入此文本的文本框绑定到 Mass.TextValue
。但是,当此值更改时,它不会调用如下所示的OnPropertyChanged()
方法,因此该值未经过验证,如何解决此问题?
private DynamicDouble mass = new DynamicDouble("Mass", 1);
public DynamicDouble Mass
{
get { return mass; }
set { mass = value; OnPropertyChanged("Mass"); }
}
DynamicDouble
类也使用 INotifyPropertyChanged
和 IDataErrorInfo
并且调用内部验证,但它是将string
转换为double
值的验证,而不是用于检查该值是否大于 0(在质量的情况下)。我不能将该范围检查放在 DynamicDouble
类中,因为它不仅用于 Mass
属性。
如果没有一个好的最小、完整和可验证的例子,就不可能确定问题是什么。
但是,根据此处的少量信息,似乎没有理由调用 OnPropertyChanged()
方法,因为永远不会调用 Mass
setter 方法。如果绑定的唯一内容是 Mass.TextValue
,则唯一会更改的是 TextValue
属性,而不是 Mass
属性。
如果要执行不适合DynamicDouble
类本身的验证,则应编写一个 ValidationRule
对象并将其附加到使用 TextValue
属性作为源的绑定。
或者,您的模型对象不应直接公开Mass
对象,而应实现例如 MassTextValue
并委托给 DynamicDouble.TextValue
属性,根据需要执行其他验证(当然,根据需要转发来自DynamicDouble
的验证结果)。
通过将所有必需的验证逻辑放入 ViewModel 类并向其添加指向模型本身中的值的属性并验证该输入而不是向下执行验证,解决了该问题。