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

Validating custom data types with IDataErrorInfo and INotifyPropertyChanged

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

没有一个好的 Minimal, Complete, and Verifiable example 就不可能确定问题是什么。

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

如果您想进行 DynamicDouble class 本身不合适的验证,那么您应该编写一个 ValidationRule 对象并将其附加到使用 ValidationRule 的绑定=13=] 属性 作为来源。

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

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