Ein ObservableCollection
kann über die Benutzeroberfläche genau wie jede Sammlung aktualisiert werden. Der wahre Unterschied ist ziemlich einfach:
ObservableCollection<T>
implementiert, INotifyCollectionChanged
das eine Benachrichtigung bereitstellt, wenn die Sammlung geändert wird (Sie haben es erraten ^^). Es ermöglicht der Bindungs-Engine, die Benutzeroberfläche zu aktualisieren, wenn die ObservableCollection
aktualisiert wird.
Allerdings BindingList<T>
implementiert IBindingList
.
IBindingList
bietet Benachrichtigung über Sammlungsänderungen, aber nicht nur das. Es bietet eine ganze Reihe von Funktionen, die von der Benutzeroberfläche verwendet werden können, um viel mehr Dinge als nur Aktualisierungen der Benutzeroberfläche gemäß Änderungen bereitzustellen, wie z.
- Sortierung
- Suchen
- Werkseitig hinzufügen (AddNew-Mitgliedsfunktion).
- Schreibgeschützte Liste (CanEdit-Eigenschaft)
Alle diese Funktionen sind in nicht verfügbar ObservableCollection<T>
Ein weiterer Unterschied besteht darin, dass BindingList
Benachrichtigungen über Elementänderungen weitergeleitet werden, wenn die Elemente implementiert werden INotifyPropertyChanged
. Wenn ein Gegenstand ein PropertyChanged
Ereignis BindingList
auslöst, erhält er einen ListChangedEvent
mit ListChangedType.ItemChanged
und OldIndex=NewIndex
(wenn ein Gegenstand ersetzt wurde OldIndex=-1
). ObservableCollection
leitet keine Artikelbenachrichtigungen weiter.
Beachten Sie, dass in Silverlight BindingList
nicht als Option verfügbar ist: Sie können jedoch ObservableCollection
s und verwenden ICollectionView
(und IPagedCollectionView
wenn ich mich gut erinnere).
BindingList
veraltet?Der praktische Unterschied besteht darin, dass BindingList für WinForms und ObservableCollection für WPF gilt.
Aus WPF-Sicht wird BindingList nicht richtig unterstützt, und Sie würden es niemals wirklich in einem WPF-Projekt verwenden, wenn Sie es nicht wirklich müssten.
quelle
Die wichtigsten Unterschiede wie Funktionen und Änderungsbenachrichtigungen zu den enthaltenen Elementen werden bereits in der akzeptierten Antwort erwähnt, es gibt jedoch noch weitere, die ebenfalls erwähnenswert sind:
Performance
Wenn
AddNew
aufgerufen wird, wirdBindingList<T>
durch eineIndexOf
Suche nach dem hinzugefügten Element gesucht. Und wennT
implementiert, wird auchINotifyPropertyChanged
der Index eines geänderten Elements durchsuchtIndexOf
(obwohl es keine neue Suche gibt, solange sich dasselbe Element wiederholt ändert). Wenn Sie Tausende von Elementen in der Sammlung speichern, kannObservableCollection<T>
(oder eine benutzerdefinierteIBindingList
Implementierung mit O (1) Suchkosten) vorzuziehen sein.Vollständigkeit
Die
IBindingList
Schnittstelle ist riesig (möglicherweise nicht das sauberste Design) und ermöglicht es den Implementierern, nur einen Teil ihrer Funktionen zu implementieren. Zum Beispiel derAllowNew
,SupportsSorting
undSupportsSearching
sagen Eigenschaften , obAddNew
,ApplySort
undFind
Verfahren verwendet werden kann, respectively. Es überrascht die Leute oft, dassBindingList<T>
das Sortieren selbst nicht unterstützt wird. Tatsächlich bietet es einige virtuelle Methoden, mit denen die abgeleiteten Klassen die fehlenden Funktionen hinzufügen können. DieDataView
Klasse ist ein Beispiel für eine vollständigeIBindingList
Implementierung. Es ist jedoch in erster Linie nicht für typisierte Sammlungen gedacht. DieBindingSource
Klasse in WinForms ist ein hybrides Beispiel: Sie unterstützt das Sortieren, wenn sie eine andereIBindingList
Implementierung umschließt , die das Sortieren unterstützt.ObservableCollection<T>
ist bereits eine vollständige Implementierung derINotifyCollectionChanged
Schnittstelle (die nur ein einziges Ereignis hat). Es hat auch virtuelle Mitglieder,ObservableCollection<T>
wird jedoch normalerweise aus demselben Grund wie seine Basisklasse abgeleitetCollection<T>
: zum Anpassen von Elementen zum Hinzufügen / Entfernen (z. B. in einer Datenmodellsammlung), anstatt Bindungsfunktionen anzupassen.Kopieren gegen Verpacken
Beide
ObservableCollection<T>
undBindingList<T>
haben einen Konstruktor, der eine bereits vorhandene Liste akzeptiert. Obwohl sie sich anders verhalten, wenn sie von einer anderen Sammlung instanziiert werden:BindingList<T>
fungiert als beobachtbarer Wrapper für die bereitgestellte Liste, und die an der Liste vorgenommenen Änderungen wirkenBindingList<T>
sich auch auf die zugrunde liegende Sammlung aus.ObservableCollection<T>
Auf der anderen Seite übergibt eine neueList<T>
Instanz an den BasiskonstruktorCollection<T>
und kopiert die Elemente der ursprünglichen Sammlung in diese neue Liste. WennT
es sich um einen Referenztyp handelt, sind Änderungen an den Elementen in der ursprünglichen Sammlung sichtbar, aber die Sammlung selbst wird nicht aktualisiert.quelle
Ein weiterer großer Unterschied zwischen
ObservableCollection
undBindingList
das ist praktisch und kann ein Gebotsentscheidungsfaktor für das Thema sein:BindingList
List Change Handler:ObservableCollection
Sammlungsänderung:Die obigen Schlussfolgerungen beziehen sich auf die
INotifyPropertyChanged
Implementierung in Modellklassen. Standardmäßig löst none das geänderte Ereignis aus, wenn eine Eigenschaft in einem Element geändert wird.quelle