Каква е целта на внедряването на 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