【问题标题】:Validating custom data types with IDataErrorInfo and INotifyPropertyChanged使用 IDataErrorInfo 和 INotifyPropertyChanged 验证自定义数据类型
【发布时间】:2016-05-07 11:52:09
【问题描述】:

我有一个保存数据的对象模型,该模型绑定到输入表单。该模型使用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 属性。

【问题讨论】:

    标签: c# wpf validation inotifypropertychanged idataerrorinfo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果没有好的Minimal, Complete, and Verifiable example,就不可能确定问题出在哪里。

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2021-07-20
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多