Как заставить привязки обновляться, особенно для производных значений? - PullRequest
2 голосов
/ 07 июня 2010

Я использую некоторые объекты CLR, которые используют интерфейс INotifyPropertyChanged и используют функцию PropertyChanged для обновления привязок WPF.

Симпатичный шаблон:

protected void RaisePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Тогда свойство:

    private double m_TotalWidgets = 0;
    public double TotalWidgets
    {
        get { return m_TotalWidgets; }
        set 
        { 
            m_TotalWidgets = value;
            RaisePropertyChanged("TotalWidgets");
        }
    }

Есть ли лучший способ обновить производное значение или даже весь класс?

Скажем, у меня было вычисленное значение:

    public double ScaledWidgets
    {
        get 
        { 
            return TotalWidgets * CONSTANT_FACTOR;
        }
    }

Мне бы пришлось запускать PropertyChanged объекта ScaledWidget при обновлении TotalWidgets, например:

        set 
        { 
            m_TotalWidgets = value;
            RaisePropertyChanged("TotalWidgets");
            RaisePropertyChanged("ScaledWidgets");
        }

Есть ли лучший способ сделать это? Можно ли «сделать недействительным» весь объект, особенно если есть много производных значений? Я думаю, что было бы отстойно запустить 100 событий PropertyChanged.

Ответы [ 2 ]

3 голосов
/ 07 июня 2010

Вы можете вызвать PropertyChangedEvent с помощью параметра string.empty или null .Тогда все свойства объекта становятся «недействительными».Смотрите мой пост здесь

0 голосов
/ 07 июня 2010

Я не знаю, есть ли лучший способ, но я могу предложить две вещи:

  1. Создать класс, который инкапсулирует срабатывание события PropertyChanged, чтобы вам не приходилось писатьмного шаблонного кода.Вам просто нужно объявить событие PropertyChanged и использовать этот класс для его вызова.
  2. Если существуют свойства, которые зависят друг от друга.Создайте обработчик для независимого свойства, чтобы при каждом его изменении вы могли вызывать зависимые свойства.Например, вы можете иметь внутренний обработчик для TotalWidgets, чтобы при его изменении вы могли соответствующим образом изменить ScaledWidgets.

Почему вам нужно написать 100 событий PropertyChanged?Может быть, это не нужно, и проблема в другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...