Какова цель реализации INotifyPropertyChanged в ObservableCollection?

ObservableCollection реализует как INotifyCollectionChanged, так и INotifyPropertyChanged.

  • Я понимаю, что о добавлении, удалении (+очистка) и замене элементов потребители уведомляются через событие коллекции CollectionChanged, и что обновления в существующих элементах можно отслеживать с помощью элементов ' событие PropertyChanged, если они реализуют себя INotifyPropertyChanged.

  • Я читал от других, что вы не можете зарегистрироваться на событие коллекции PropertyChanged, потому что оно доступно только для чтения.

Итак, какова его цель, как мы можем его использовать?

Комментарии здесь и там, кажется, запутывают дискуссию, подразумевая, что магия ObservableCollection заключается в реализации обоих интерфейсов, позволяющих получать уведомления как об изменениях содержимого коллекций, так и элементов, хотя это неверно (это игнорируется во многих примерах, где коллекция привязана к списку, который волшебным образом обновляется после изменения содержимого элементов, предполагая, что коллекция уведомляет список).

На самом деле кажется, что единственным преимуществом коллекции является реализация INotifyCollectionChanged. Работать с изменениями свойств элементов с ObservableCollection кажется ничуть не проще, чем с другой коллекцией: это возможно только в том случае, если элементы реализуют INotifyPropertyChanged, чего они могут и не делать, и если пользователю удается перехватить это событие независимо от коллекции.

Это правильно?


person wpf    schedule 20.12.2009    source источник


Ответы (3)


Если вы посмотрите на исходный код ObservableCollection<T> с помощью Reflector, вы увидите, что это событие вызывается для двух свойств:

this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");

Обратите внимание, что ObservableCollection<T> явно реализует INotifyPropertyChanged, поэтому вы можете получить доступ к событию PropertyChanged только через переменную INotifyPropertyChanged:

INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
person Thomas Levesque    schedule 20.12.2009
comment
Хотя на самом деле это точно и лаконично, я не уверен, как это отвечает на вопрос, так в чем цель? часть Q - person Andrew; 20.12.2009
comment
Цель состоит в том, чтобы уведомить подписчиков об изменении коллекции. В этом аспекте оно служит той же цели, что и событие CollectionChanged, но INotifyPropertyChanged поддерживается более широко, чем INotifyCollectionChanged. - person Thomas Levesque; 20.12.2009

Механизм привязки WPF может использовать INotifyPropertyChanged (INpc) по умолчанию.

INpc, как следует из названия, позволяет WPF обнаруживать изменения в свойствах объектов, которые могут быть частью коллекции, а могут и не быть.

ObservableCollection (OC) реализует INotifyCollectionChanged (InCC), где, как вы говорите, сама коллекция уведомляет WPF (и всех, кто может обрабатывать обновления) об обновлениях своей коллекции элементов (добавление, удаление и т. д.). Если OC содержит объекты, которые сами по себе не реализуют INpc, WPF не сможет узнать, как изменились свойства каждого элемента.

Обновить

Отвечая на следующий вопрос: «Можем ли мы полагаться на событие коллекции INpc вместо регистрации каждого нового элемента для получения уведомлений?» ответ - нет. Если каждый элемент не реализует Inpc для своих свойств, тогда WPF не сможет узнать, какие значения изменились для каждого элемента.

WPF по-прежнему будет знать от OC, когда элементы были добавлены или удалены частично. Свойство Items использует INpc для уведомления об обновлениях, как и любой класс, реализующий INpc для своих свойств. InCC реализован для отслеживания изменений коллекции, а не значений для каждого элемента внутри элементов.

person Andrew    schedule 20.12.2009

Просто предположение: чтобы можно было получать уведомления об изменениях свойства Count коллекции?

person Grokys    schedule 20.12.2009