Какова цель того, что реализовала INotifyPropertyChanged на ObservableCollection?

ObservableCollection реализации оба INotifyCollectionChanged и INotifyPropertyChanged.

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

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

Таким образом, какова его цель, какое использование мы можем сделать ее?

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

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

Это корректно?

8
задан Naser Asadi 27 July 2013 в 09:02
поделиться

3 ответа

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

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

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

Обновление

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

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

3
ответ дан 5 December 2019 в 12:59
поделиться

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

1
ответ дан 5 December 2019 в 12:59
поделиться

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

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

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

INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
9
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: