使用 IDataErrorInfo 和 INotifyPropertyChanged 验证自定义数据类型

本文关键字:定义数据类型 验证 INotifyPropertyChanged IDataErrorInfo 使用 | 更新日期: 2023-09-27 18:32:25

我有一个保存数据的对象的模型,该模型绑定到输入表单。此模型使用IDataErrorInfoINotifyPropertyChanged来验证其内容。我有一种将像"(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类也使用 INotifyPropertyChangedIDataErrorInfo 并且调用内部验证,但它是将string转换为double值的验证,而不是用于检查该值是否大于 0(在质量的情况下)。我不能将该范围检查放在 DynamicDouble 类中,因为它不仅用于 Mass 属性。

使用 IDataErrorInfo 和 INotifyPropertyChanged 验证自定义数据类型

如果没有一个好的最小、完整和可验证的例子,就不可能确定问题是什么。

但是,根据此处的少量信息,似乎没有理由调用 OnPropertyChanged() 方法,因为永远不会调用 Mass setter 方法。如果绑定的唯一内容是 Mass.TextValue ,则唯一会更改的是 TextValue 属性,而不是 Mass 属性。

如果要执行不适合DynamicDouble类本身的验证,则应编写一个 ValidationRule 对象并将其附加到使用 TextValue 属性作为源的绑定。

或者,您的模型对象不应直接公开Mass对象,而应实现例如 MassTextValue并委托给 DynamicDouble.TextValue 属性,根据需要执行其他验证(当然,根据需要转发来自DynamicDouble的验证结果)。

通过将所有必需的验证逻辑放入 ViewModel 类并向其添加指向模型本身中的值的属性并验证该输入而不是向下执行验证,解决了该问题。