如何为类的属性生成错误

时间:2019-02-21 14:47:24

标签: c# wpf binding idataerrorinfo

我有一个具有属性的ViewModel。 此属性是“ PhysicalValue”。该PhysicalValue是一个由值和单位组成的类。

[...]
<dxe:TextEdit EditValue="{Binding Target.Value, ValidatesOnDataErrors =true}"></dxe:TextEdit>
[...]

我有一个控件应该编辑此PhysicalValue的值:

Target.Value

但是我没有错(可能是因为它搜索Target时出错。我尝试了另一种方法,直接绑定到this.localData.forEach(x => { x.DataSource = x.DataSource ? '' || 'XXX' : 'MyVAL' }); ,但这是行不通的,因为我需要将convertBack转换为已知最初用于重建PhysicalValue的单位。

您将如何解决?

1 个答案:

答案 0 :(得分:1)

TextEdit 控件的 EditValue 属性绑定到PhysicalValue.Value。将Binding.ValidatesOnDataErrors设置为true时,绑定引擎将检查具有target属性的类是否实现IDataErrorInfo。 为此,PhysicalValue类需要实现IDataErrorInfo

class PhysicalValue : IDataErrorInfo
{
    public double Value { get; set; }

    public object Unit { get; set; }

    public string Error => this["Value"] + this["Unit"];

    public PhysicalValue(int v, object u)
    {
        Value = v;
        Unit = u;
    }

    public string this[string columnName]
    {
        get
        {
            if (columnName == "Value")
            {
                if (Value > 5000)
                {
                    return "out of spec value";
                }
            }
            return String.Empty;
        }
    }
}

如果PhysicalValue类无法保存验证逻辑或无法实现IDataErrorInfo接口,则可以创建一个处理验证的代理类并绑定到该代理类。这是一个小例子:

class PhysicalValueValidator : IDataErrorInfo
{
    private readonly PhysicalValue _physicalValue;
    private double _maxValue;

    public double Value
    {
        get { return _physicalValue.Value; }
        set { _physicalValue.Value = value; }
    }

    public PhysicalValueValidator(PhysicalValue pv)
    {
        _physicalValue = pv;
        _maxValue = 5000;
    }

    public void SetMaxValue(double maxValue)
    {
        _maxValue = maxValue;
    }

    public string this[string columnName]
    {
        get
        {
            if (columnName == "Value")
            {
                if (Value > _maxValue)
                {
                    return "out of spec value";
                }
            }
            return String.Empty;
        }
    }

    public string Error => this["Value"];
}

PhysicalValueValidator类公开了SetMaxValue(..)方法,以从窗格viewmodel更新验证逻辑。视图模型可能如下所示:

class MyViewModel 
{
    private PhysicalValue _target;

    public PhysicalValueValidator TargetValidator { get; }

    public MyViewModel()
    { 
        _target = new PhysicalValue(5, 10);
        TargetValidator = new PhysicalValueValidator(_target);

        // update validation Logic...
        TargetValidator.SetMaxValue(6000);
    }
}

在您的xaml代码中,绑定到TargetValidator.Value而不是Target.Value。

有关IDataErrorInfo的更多信息,请检查以下链接:IDataErrorInfo