Свойство 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