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>();
War es hilfreich?

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 ObservableCollections 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 die AllowNew, SupportsSorting und SupportsSearching Eigenschaften ob AddNew, ApplySort und Find Verfahren verwendet werden können, respectively. Es überrascht oft Menschen, die sich BindingList<T> nicht Sortierung nicht unterstützt. Eigentlich bietet es einige virtuelle Methoden lassen sich die abgeleiteten Klassen die fehlenden Funktionen hinzuzufügen. Die DataView Klasse ist ein Beispiel für eine vollständige IBindingList Umsetzung; es ist jedoch nicht für typisierte Sammlungen an erster Stelle. Und die BindingSource Klasse in WinForms ist ein Hybrid. Beispiel: es Sortierung unterstützt, wenn es eine andere IBindingList Implementierung wickelt, die Stütze Sortierung

  • ObservableCollection<T> ist bereits eine vollständige Implementierung der INotifyCollectionChanged Schnittstelle (die nur ein einzelnes Ereignis hat). Es hat auch virtuelle Mitglieder aber ObservableCollection<T> wird in der Regel aus dem gleichen Grunde wie seine Basis Collection<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 der BindingList<T> durchgeführten Änderungen werden auch auf die zugrunde liegende Sammlung reflektiert werden.
  • ObservableCollection<T> auf der anderen Seite geht eine neue List<T> Instanz an der Basis Collection<T> Konstruktor und kopiert die Elemente der ursprünglichen Sammlung in dieser neuen Liste. Natürlich, wenn T 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 der ListChanged Fall, dass Ihnen alle Details geben   von Immobilien (in PropertyDescriptor) und ObservableCollection werden Ihnen nicht geben. Eigentlich   ObservableCollection 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top