Какова цель внедрения INotifyPropertyChanged в ObservableCollection? - PullRequest
8 голосов
/ 20 декабря 2009

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

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 20 декабря 2009

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

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

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

INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
3 голосов
/ 20 декабря 2009

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

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

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

Обновление

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

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

1 голос
/ 20 декабря 2009

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

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