Der Unterschied zwischen ObservableCollection und Binding
-
28-09-2019 - |
Frage
Ich mag den Unterschied zwischen ObservableCollection
und BindingList
wissen, weil ich beide verwendet habe, für jede Hinzufügen / Löschen von Änderung Quelle zu informieren, aber ich weiß wirklich nicht, wenn man über die andere bevorzugen.
Warum sollte ich wählen Sie eine der folgenden über den anderen?
ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();
oder
BindingList<Employee> lstEmp = new BindingList<Employee>();
Lösung
Ein ObservableCollection
kann genau wie jede Sammlung von UI aktualisiert werden. Der wahre Unterschied ist recht einfach:
ObservableCollection<T>
implementiert INotifyCollectionChanged
die Benachrichtigung bereitstellt, wenn die Sammlung geändert wird (Sie ahnen ^^)
Es ermöglicht das Bindungsmodul die Benutzeroberfläche zu aktualisieren, wenn der ObservableCollection
aktualisiert wird.
Allerdings BindingList<T>
Geräte IBindingList
.
IBindingList
eine Benachrichtigung über Sammlung Änderungen, aber nicht nur das. Es bietet eine ganze Reihe von Funktionen, die von der Benutzeroberfläche verwendet werden kann, entsprechend den Veränderungen viel mehr Dinge als nur UI-Updates zur Verfügung zu stellen, wie:
- Sortierung
- Suchen
- Fügen Sie durch Fabrik (AddNew Member-Funktion).
- Read-only-Liste (CanEdit Eigenschaft)
All diese Funktionen sind nicht in ObservableCollection<T>
Ein weiterer Unterschied besteht darin, dass BindingList
Relais Artikel Änderungsbenachrichtigungen, wenn ihre Elemente INotifyPropertyChanged
implementieren. Wenn ein Artikel ein PropertyChanged
Ereignis auslöst, erhält der BindingList
es sich um ein ein ListChangedEvent
mit ListChangedType.ItemChanged
und OldIndex=NewIndex
erhöht (wenn ein Element ersetzt wurde, OldIndex=-1
). ObservableCollection
hat Relais nicht Artikel Benachrichtigungen.
Beachten Sie, dass in Silverlight, BindingList
ist als Option nicht zur Verfügung. Sie aber ObservableCollection
s und ICollectionView
verwenden kann (und IPagedCollectionView
wenn ich erinnere mich gut an)
Andere Tipps
Der praktische Unterschied ist, dass Binding für WinForms ist, und ObservableCollection ist für WPF.
Von einer WPF-Perspektive, isnt Binding richtig unterstützt, und Sie würden es wirklich noch nie in einem WPF-Projekt verwenden, es sei denn, Sie wirklich haben.
Die wichtigsten Unterschiede wie Merkmale und Änderungsbenachrichtigungen über die enthaltenen Elemente sind bereits durch die akzeptierte Antwort erwähnt, aber es gibt mehr, die auch erwähnenswert:
Performance
Wenn AddNew
genannt wird, BindingList<T>
sucht nach dem zusätzlichen Elemente durch einen IndexOf
Nachschlag. Und wenn T
Geräte den Index eines geänderten Elements INotifyPropertyChanged
ist auch durch IndexOf
gesucht (obwohl es keine neuen Lookup, solange das gleiche Element ändert wiederholt). Wenn Sie Tausende von Elementen in der Sammlung speichern, dann ObservableCollection<T>
(oder eine benutzerdefinierten IBindingList
Umsetzung mit O (1) Lookup-Kosten) kann mehr vorzuziehen sein.
Vollständigkeits
-
Die
IBindingList
-Schnittstelle ist ein riesiger ein (vielleicht nicht das sauberste Design) und ermöglicht es, die Implementierer nur einen Teil seiner Funktionen zu implementieren. Zum Beispiel sagen dieAllowNew
,SupportsSorting
undSupportsSearching
Eigenschaften obAddNew
,ApplySort
undFind
Verfahren verwendet werden können, respectively. Es überrascht oft Menschen, die sichBindingList<T>
nicht Sortierung nicht unterstützt. Eigentlich bietet es einige virtuelle Methoden lassen sich die abgeleiteten Klassen die fehlenden Funktionen hinzuzufügen. DieDataView
Klasse ist ein Beispiel für eine vollständigeIBindingList
Umsetzung; es ist jedoch nicht für typisierte Sammlungen an erster Stelle. Und dieBindingSource
Klasse in WinForms ist ein Hybrid. Beispiel: es Sortierung unterstützt, wenn es eine andereIBindingList
Implementierung wickelt, die Stütze Sortierung -
ObservableCollection<T>
ist bereits eine vollständige Implementierung derINotifyCollectionChanged
Schnittstelle (die nur ein einzelnes Ereignis hat). Es hat auch virtuelle Mitglieder aberObservableCollection<T>
wird in der Regel aus dem gleichen Grunde wie seine BasisCollection<T>
Klasse abgeleitet: (. ZB in einer Datenmodell-Sammlung). Zum Anpassen Element hinzufügen / entfernen, anstatt Bindungsfunktionen Einstellung
Kopieren vs. Verpackung
Sowohl ObservableCollection<T>
und BindingList<T>
haben einen Konstruktor, der eine bereits bestehende Liste akzeptiert. Obwohl sie sich anders verhalten, wenn sie von einer anderen Sammlung instanziiert werden:
-
BindingList<T>
fungiert als eine beobachtbare Wrapper für die bereitgestellten Liste, und die auf derBindingList<T>
durchgeführten Änderungen werden auch auf die zugrunde liegende Sammlung reflektiert werden. -
ObservableCollection<T>
auf der anderen Seite geht eine neueList<T>
Instanz an der BasisCollection<T>
Konstruktor und kopiert die Elemente der ursprünglichen Sammlung in dieser neuen Liste. Natürlich, wennT
eine Referenz-Typ Änderungen an den Elementen aus der ursprünglichen Sammlung sichtbar sein, aber die Sammlung selbst wird nicht aktualisiert werden.
One More großer Unterschied zwischen ObservableCollection
und BindingList
, die praktisch ist, und kann ein Gebot Entscheidungsfaktor auf dem Thema sein:
BindingList
Liste ändern Handler:
ObservableCollection
Sammlung ändern:
Kurz von Oben: Wenn eine Eigenschaft eines Elements in
BindingList
geändert wird, wird derListChanged
Fall, dass Ihnen alle Details geben von Immobilien (in PropertyDescriptor) undObservableCollection
werden Ihnen nicht geben. EigentlichObservableCollection
nicht Änderungsereignis für eine Eigenschaft erhöhen in einem Punkt geändert.
Vor Abschluss ist in Bezug von INotifyPropertyChanged
in Modellklassen implementiert. In der Standardeinstellung keine hebt das geänderte Ereignis, wenn eine Eigenschaft in einem Punkt geändert wird.