2009-12-20 6 views
7

ObservableCollection implementiert sowohl INotifyCollectionChanged als auch INotifyPropertyChanged.Was ist der Zweck der Implementierung von INotifyPropertyChanged auf ObservableCollection?

  • Ich verstehe, dass Ergänzungen, Deletionen (+ clear), und Ersatz von Artikel sind meldepflichtig die Verbraucher durch die Sammlung ‚s Ereignis CollectionChanged, und dass Updates in den vorhandenen Elemente können sein überwacht unter Verwendung der Elemente 'Ereignis PropertyChanged, wenn sie selbst INotifyPropertyChanged implementieren.

  • ich von anderen gelesen, dass man nicht Register auf der Veranstaltungs Sammlung PropertyChanged weil es nur lesbar ist.

Also, was ihr Zweck ist es, welche Nutzung können wir davon? Die Kommentare hier und dort scheinen die Diskussion verwirrend zu machen, indem sie andeuten, dass die Magie von ObservableCollection darin besteht, beide Schnittstellen zu implementieren, so dass sie sowohl für Sammlung als auch für Inhaltsänderungen benachrichtigt werden können, obwohl dies nicht korrekt ist viele Beispiele, bei denen die Sammlung an eine Listbox gebunden ist, die sich magisch ändert, nachdem der Inhalt der Elemente geändert wurde, was darauf hinweist, dass die Sammlung die Listbox benachrichtigt).

Eigentlich scheint es die einzige Überlegenheit der Sammlung zu implementieren INotifyCollectionChanged. Mit ObservableCollection umzugehen, ist mit ObservableCollection gar nicht einfacher: Es ist nur möglich, wenn die Elemente INotifyPropertyChanged implementieren, was sie nicht tun dürfen, und wenn der Benutzer dieses Ereignis unabhängig von der Sammlung anhängt.

Ist das korrekt?

Antwort

1

Nur eine Vermutung: So kann man über Änderungen an der Count-Eigenschaft der Sammlung benachrichtigt werden?

3

WPFs Bindungsmechanismus kann INotifyPropertyChanged (INpc) aus der Box verwenden.

INpc, wie der Name vermuten lässt, ermöglicht WPF, Änderungen an Objekteigenschaften zu erkennen, die Teil einer Sammlung sein können oder nicht.

ObservableCollection (OC) implementiert INotifyCollectionChanged (InCC), wobei die Sammlung selbst WPF (und jeden anderen, der mit den Aktualisierungen ausgestattet ist) von Aktualisierungen seiner Elementauflistung benachrichtigt (Hinzufügen von Löschvorgängen usw.). Wenn das OC Objekte enthält, die INpc nicht selbst implementieren, kann WPF nicht wissen, wie sich die Eigenschaften jedes Elements geändert haben.

aktualisieren

In die folgende Frage zu beantworten „können wir vertrauen auf die Ereigniserfassung INPC statt für auf jedem neuen Artikel Registrierung informiert zu werden?“ Die Antwort ist nein. Wenn jedes Element Inpc nicht in seinen Eigenschaften implementiert, kann WPF nicht wissen, welche Werte sich pro Element geändert haben.

WPF wird immer noch aus dem OC wissen, wenn die Elemente teilweise hinzugefügt oder gelöscht wurden. Die Items-Eigenschaft verwendet den INpc, um über Aktualisierungen zu informieren, genau wie jede Klasse, die INpc in ihren Eigenschaften implementiert. InCC wird implementiert, um Sammlungsänderungen und nicht Werte für jeden Artikel innerhalb von Artikeln zu verfolgen.

9

Wenn Sie an der ObservableCollection<T> Quellcode schauen mit Reflektor, können Sie sehen, dass dieses Ereignis für zwei Eigenschaften erhöht wird:

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

Beachten Sie, dass ObservableCollection<T> Geräte INotifyPropertyChanged explizit, so können Sie das PropertyChanged Ereignis Zugriff nur durch a INotifyPropertyChanged Variable:

INotifyPropertyChanged inpc = myObservableCollection; 
inpc.PropertyChanged += myEventHandler; 
+0

Während sachlich präzise und prägnant bin ich mir nicht sicher, wie das beantwortet die "so was ist der Zweck?" Teil der Q – Andrew

+2

Der Zweck ist, Abonnenten zu benachrichtigen, dass die Sammlung geändert wurde. In diesem Aspekt dient es dem gleichen Zweck wie das CollectionChanged-Ereignis, aber INotifyPropertyChanged wird weiter unterstützt als INotifyCollectionChanged –

+0

wie für den Fall, dass etwas an die Anzahl der Sammlung bindet. – dan