Как сгенерировать ошибку для свойства класса - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть одна ViewModel, у которой есть свойство.Это свойство является «Физическим значением».Это PhysicalValue - это класс, который состоит из Value и Unit.

public Class MyViewModel:INotifyPropertyChanged:IDataErrorInfo {
    public PhysicalValue Target {get => _target; set => {_target = value; NotifyPropertyChanged("Target");}}

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

У меня есть один элемент управления, который должен редактировать значение этого PhysicalValue:

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

Но я 'у меня нет ошибки (вероятно, потому что он ищет Target.Value для ошибки. Я пробовал другой подход, привязка напрямую к Target, но это не работает, потому что мне нужен convertBack, чтобы узнать, какой модуль использовалсяпервоначально для восстановления PhysicalValue.

Как бы вы решили это?

1 Ответ

0 голосов
/ 21 февраля 2019

Свойство EditValue вашего TextEdit элемента управления привязано к 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(..) для обновления логики проверки из вашей модели представления панелей.Модель представления может выглядеть следующим образом:

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

...