У меня есть ситуации, когда у меня есть несколько переменных, которые ЦЕННОСТИ зависят друг от друга, как это:PropertyChanged влияет на некоторые свойства
А функция B и C B является функцией A и C C является функцией от A и B
Любое значение может изменяться в пользовательском интерфейсе. Я делаю уведомление расчета и изменения, как это:
private string _valA;
private string _valB;
private string _valC;
public string ValA
{
get { return _valA; }
set
{
if (_valA != value)
{
_valA = value;
RecalculateValues("ValA"); //Here ValB and ValC are calculated
OnPropertyChanged("ValA");
}
}
}
public string ValB
{
get { return _valB; }
set
{
if (_valB != value)
{
_valB = value;
RecalculateValues("ValB"); //Here ValA and ValC are calculated
OnPropertyChanged("ValB");
}
}
}
(...)
private void RecalculateValues(string PropName)
{
if (PropName == "ValA")
{
_valB = TotalValue * _valA;
OnPropertyChanged("ValB");
_valC = something * _valA
OnPropertyChanged("ValC");
}
else
(...)
}
Я вызываю метод расчета на сеттера измененной переменной, вычисление значения для _valB, _valC (например), а затем вызвать PropertyChanged для вот эти. Я делаю это так из-за зависимостей между переменными, например, я могу контролировать, какая переменная вычисляется с правильными значениями. Я также подумал о запуске PropertyChanged для других переменных и выполнить вычисления на получателе переменных, но мне нужно было бы знать, какое свойство было изменено до этого и использовать это значение ... не уверен, что это лучшее/самое простое решение.
Это хороший способ сделать это? Мне не нравится идея выполнить это в блоке setter, но в то время я не вижу лучшего способа сделать это. Вы видите любое другое (лучшее или более чистое решение)?
Еще одна проблема, с которой я столкнулся, заключается в использовании IdataErrorInfo для проверки/представления информации об ошибках в пользовательском интерфейсе. Дело в том, что этот индексщик [columnName] вызывается в конце сеттера, и мне нужно было проверить значения перед вычислением, поэтому что если введенное значение недействительно, расчет не произойдет. Я всерьез подумываю о том, чтобы отказаться от IDataErrorInfo и просто вызвать метод проверки до того, как произойдет расчет (ы). Есть ли способ явно называть это или сразу после присвоения ценности?
ПРИМЕЧАНИЕ: ValidationRules не являются опцией, потому что мне нужно вызвать логику проверки на другом объекте из моего ViewModel.
У вас есть '_valA' и т. Д., Введенные как строки, но вы выполняете« умножение »на строках, как в' _valB = TotalValue * _valA'. Пожалуйста, объясни. – jason