Liste <T> vs BindingList <T> Vorteile / Nachteile

91

Kann jemand beschreiben, was der Unterschied zwischen den beiden für mein Projekt ist.

Derzeit habe ich eine List<MyClass>und setze die BindingSource darauf und eine DataGridView auf die BindingSource.

Ich habe es IEditableObjectso implementiert, dass ich beim Aufruf von CancelEdit mein Objekt auf das zurücksetze, was es mit a warMemberwise.Clone()

Wird das Ändern meiner Liste in eine BindingList all dies lösen und welche Vorteile bietet die Verwendung einer BindingList?

Jon
quelle

Antworten:

123

A List<>ist einfach ein Array zur automatischen Größenänderung von Elementen eines bestimmten Typs mit einigen Hilfsfunktionen (z. B. Sortieren). Es sind nur die Daten, und Sie werden sie wahrscheinlich verwenden, um Operationen für eine Reihe von Objekten in Ihrem Modell auszuführen.

A BindingList<>ist ein Wrapper um eine typisierte Liste oder eine Sammlung, die die IBindingListSchnittstelle implementiert . Dies ist eine der Standardschnittstellen, die die bidirektionale Datenbindung unterstützen. Es funktioniert durch Implementieren des ListChangedEreignisses, das beim Hinzufügen, Entfernen oder Festlegen von Elementen ausgelöst wird. Gebundene Steuerelemente hören dieses Ereignis ab, um zu wissen, wann ihre Anzeige aktualisiert werden muss.

Wenn Sie die DataSource einer BindingSource auf a setzen List<>, wird intern eine erstellt BindingList<>, um Ihre Liste zu verpacken. Möglicherweise möchten Sie Ihre Liste vorab mit einer Liste versehen, BindingList<>wenn Sie außerhalb der BindingSource darauf zugreifen möchten. Andernfalls ist dies jedoch genauso. Sie können auch von erben BindingList<>, um beim Ändern von Elementen ein spezielles Verhalten zu implementieren.

IEditableObjectwird von der BindingSource verwaltet. BeginEdit wird für jedes implementierende Objekt aufgerufen, wenn Sie die Daten in einem gebundenen Steuerelement ändern. Sie können dann EndEdit / CancelEdit in der BindingSource aufrufen und es wird an Ihr Objekt weitergeleitet. Wenn Sie in eine andere Zeile wechseln, wird auch EndEdit aufgerufen.

Alex J.
quelle
Derzeit wird mit meinem List <T> -Ansatz beim Aufrufen von CancelEdit das zu bearbeitende Element nicht in den ursprünglichen Zustand zurückgesetzt, weshalb ich Clone () verwende. Wollen Sie damit sagen, dass eine Bindungsliste das für mich erledigt?
Jon
3
Nein, eine BindingList hat nichts mit dieser Funktionalität zu tun. Die BindingSource ruft einfach CancelEdit für das aktuelle Objekt auf, unabhängig vom Typ der zugrunde liegenden Liste. Das Framework enthält nichts, was die Objektversionierung für einfache Objekte automatisch implementiert. Sie können DataTables / DataRows verwenden, die nur zu diesem Zweck eine Originalkopie der Daten aufbewahren.
Alex J
Sie sagen, dass Steuerelemente wissen müssen, wann sich die Liste ändert. Können Sie dies näher erläutern? Ich habe ein Formular mit einer Datagrid-Ansicht und dann ein anderes Formular mit ausgefüllten Daten. Muss ich mir Gedanken darüber machen, was Sie in dieser Angelegenheit sagen?
Jon
Das DataGrid muss beispielsweise wissen, wann Elemente zu Ihrer Liste hinzugefügt werden, um eine neue Zeile hinzuzufügen. Dafür wird das ListChanged-Ereignis der BindingList verwendet. Wenn Sie das Raster direkt an eine Liste <T> binden würden, hätten Sie das Ereignis nicht und das Raster könnte nicht wissen, wann Sie die Liste geändert haben. Sie müssen sich in Ihrem Szenario keine Sorgen machen, da die BindingSource die Liste <T> für Sie in eine BindingList einschließt. Solange Sie mit der BindingSource und nicht mit der Liste selbst arbeiten, bleiben die Steuerelemente synchron.
Alex J
Gibt es eine Problemumgehung für die Verwendung von BindingList für die WPF-Benutzeroberfläche (mvvm-Methode)? Kann ich die Bindungsliste in eine beobachtbare Sammlung einbinden?
Lance
12

Eine BindingList ermöglicht die bidirektionale Datenbindung mithilfe von Ereignissen. Eine Liste löst keine Ereignisse aus, wenn sich ihre Sammlung ändert.

Ich denke nicht, dass es Ihr spezielles Problem beheben wird.

Gerrie Schenck
quelle