Обновление привязок к свойствам, которые автоматически рассчитываются - PullRequest
1 голос
/ 25 декабря 2011

У меня есть 3 текстовых поля в WPF, привязанных к трем свойствам моего бизнес-объекта.Текстовые поля позволяют пользователю вводить три разные длины.

У меня есть несколько текстовых блоков, привязанных к другим свойствам, которые отображают простые вычисления из 3 входов.Значения этих свойств рассчитываются в методе get каждого свойства следующим образом:

public double Length1 { get; set }
public double Length2 { get; set }
public double Length3 { get; set }
public double Result1 
{
    get { return Length1 - Length2 - Length3; }
}
public double Result2
{
    get { return Length1 + Length2 + Length3; }
}

Как я могу обновить привязки Result1 и Result2 после изменений, внесенных в Lengths1,2 или 3?

Спасибо

Ответы [ 2 ]

3 голосов
/ 25 декабря 2011

Если ваша ViewModel реализует событие INotifyPropertyChanged, вы хотите (к сожалению) отбросить эти автоматические свойства и вызвать событие PropertyChanged всякий раз, когда изменяется длина1, длина2 или длина3.

PropertyChanged(this, new PropertyChangedEventArgs("Result1"));

private double _length1;
public double Length1 {
   get { return _length1; }
   set {
       _length = value;  
       PropertyChanged(this, new PropertyChangedEventArgs("Result1"));
       PropertyChanged(this, new PropertyChangedEventArgs("Result2"));
       PropertyChanged(this, new PropertyChangedEventArgs("Length1"));
   }

Но этоутомляет довольно быстро, поэтому я обычно реализую вспомогательный метод:

void RaiseThese(params string[] properties){
   foreach(string prop in properties)
       PropertyChanged(this, new PropertyChangedEventArgs(prop));
}

А затем

public double Length1 {
   get { return _length1; }
   set {
       _length = value;  
       RaiseThese("Result1", "Result2", "Length1");
   }
2 голосов
/ 25 декабря 2011

Используйте INotifyPropertyChanged и вызовите Событие для Результата1 и Результата2 в Длина1, Длина2 и Длина3.

private double _length1;
public double Length1
{
    get { return _length1; }
    set
    {
        if (_length1 == value) return;
        _length1 = value;
        OnPropertyChanged("Length1");
        OnPropertyChanged("Result1");
        OnPropertyChanged("Result2");
    }
}

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...