Понимание INotifyPropertyChanged

#c# #wpf #mvvm

#c# #wpf #mvvm

Вопрос:

Когда мы реализуем INotifyPropertyChanged, о чем он уведомляет?

Это только уведомление о представлении (я сомневаюсь в этом) или каждое свойство, имеющее имя (что может привести к нежелательным последствиям). Или это только те свойства, которые существуют в DataContext (сомнительно, поскольку в модели, возможно, нет DataContext)?

Возможно ли иметь одну функцию, например

 public class Demo : BaseViewModel
{
    public void UpdateAll()
    {
        //Update properties which do not exist in this class
        OnPropertyChanged("NameFromClassA");
        OnPropertyChanged("NameFromClassB");
        OnPropertyChanged("AgeInClassA");
        OnPropertyChanged("AgeInClassC");
    }
}
 

Я пробовал, но не могу заставить его работать. В окне вывода нет ошибок привязки или каких-либо проблем со временем выполнения / компилятором.

Комментарии:

1. Он уведомляет того, кто слушает… который не может быть никем

2. Когда вы привязываете элемент пользовательского интерфейса к свойству объекта, этот элемент пользовательского интерфейса автоматически подписывается на событие PropertyChanged (это только один пример того, как он используется). Когда вы вызываете событие, оно запускает пользовательский интерфейс для чтения вашего свойства и, возможно, обновления экрана. Комментарий в вашем примере кода неверен — идея состоит не в том, чтобы обновлять свойства в других классах, а в том, чтобы другие объекты (подписчики) знали, когда ваше свойство изменилось, чтобы они могли каким-то образом реагировать.

Ответ №1:

Интерфейс INotifyPropertyChanged используется для уведомления клиентов, обычно привязывающих клиентов, об изменении значения свойства.

OnPropertyChanged("NameFromClassA") обычно реализуется в BaseViewModel Class и эквивалентно выполнению :

     if (this.PropertyChanged != null)
      this.PropertyChanged(this, new PropertyChangedEventArgs("NameFromClassA"));
 

Он сообщает тому, кто прослушивает PropertyChanged событие вашей демонстрации Class , что Property имя «NameFromClassA» изменило значение (ваш пример неверен, потому Property что в вашем нет такого Class ).

Это необходимо для DependencyProperties привязки к Properties вашей виртуальной машине для самостоятельного обновления и редко используется для чего-либо еще.


Редактировать:

Psoeudo-код того, что примерно эквивалентно тому, что механизм привязки делает за сценой :

 ClassA myClassA;
string myPropertyBoundToNameOfClassA;

// somewhere after myClassA was initialized
myClassA.PropertyChanged  = OnMyClassAPropertyChanged;

void MyClassAPropertyChanged(string name)
{
   if (name == "NameFromClassA")
       myPropertyBoundToNameOfClassA = myClassA.Name;
}
 

Комментарии:

1. It tells whoever is listening to the PropertyChanged event of your Demo Class Это была важная часть и ответ — то, что он уведомляет только свойства в том же классе (или, я полагаю, унаследованные).

2. Я добавил несколько очень упрощенных псевдо-кодов того, что механизм привязки делает за сценой. Он просто подписывается на PropertyChanged событие экземпляра a Class и, следовательно, знает, что событие касается только этого экземпляра this Class

Ответ №2:

Интерфейс INotifyPropertyChanged используется для уведомления клиентов, обычно привязывающих клиентов, об изменении значения свойства.

Например, рассмотрим объект Person со свойством FirstName . Чтобы предоставить общее уведомление об изменении свойства, тип Person реализует интерфейс INotifyPropertyChanged и вызывает событие PropertyChanged при изменении FirstName.

Чтобы уведомление об изменении происходило в привязке между связанным клиентом и источником данных, ваш связанный тип должен либо: Реализовать интерфейс INotifyPropertyChanged (предпочтительный). Предоставьте событие изменения для каждого свойства связанного типа.

Для примера программы проверьте это: MSDN