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

时间:2016-01-29 16:44:04

标签: c# wpf validation inotifypropertychanged idataerrorinfo

我有一个包含数据的对象的模型,它绑定到输入表单。此模型使用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的验证} value,不用于检查该值是否大于0(如果是质量)。我无法在DynamicDouble类中进行范围检查,因为它不仅仅用于Mass属性。

2 个答案:

答案 0 :(得分:0)

如果没有好的Minimal, Complete, and Verifiable example,就无法确定问题是什么。

但是,根据这里的小信息,似乎好像没有理由调用OnPropertyChanged()方法,因为Mass setter方法是从未打电话过如果绑定的唯一内容是Mass.TextValue,那么唯一会改变的是TextValue属性,而不是Mass属性。

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

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

答案 1 :(得分:0)

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