List <T> vs BindingList <T> Vantaggi / svantaggi


91

Qualcuno può descrivere qual è la differenza tra i due per il mio progetto.

Attualmente ho un List<MyClass>e ho impostato BindingSource su quello e DataGridView su BindingSource.

Ho implementato IEditableObjectcosì quando viene chiamato CancelEdit ripristino il mio oggetto come era con un fileMemberwise.Clone()

Cambiare la mia lista in una BindingList risolverà tutto questo e quali sono i vantaggi dell'utilizzo di una BindingList?

Risposte:


123

A List<>è semplicemente un array ridimensionato automaticamente, di elementi di un dato tipo, con un paio di funzioni di supporto (ad esempio: sort). Sono solo i dati e probabilmente li utilizzerai per eseguire operazioni su un insieme di oggetti nel tuo modello.

A BindingList<>è un wrapper attorno a un elenco digitato o una raccolta, che implementa l' IBindingListinterfaccia. Questa è una delle interfacce standard che supportano l'associazione dati bidirezionale. Funziona implementando l' ListChangedevento, che viene generato quando si aggiungono, rimuovono o impostano elementi. I controlli associati ascoltano questo evento per sapere quando aggiornare la loro visualizzazione.

Quando si imposta DataSource di BindingSource su a List<>, viene creato internamente a BindingList<>per racchiudere l'elenco. Potresti voler pre-avvolgere il tuo elenco con un BindingList<>te stesso se vuoi accedervi al di fuori di BindingSource, ma per il resto è lo stesso. È inoltre possibile ereditare da BindingList<>per implementare un comportamento speciale durante la modifica degli elementi.

IEditableObjectè gestito da BindingSource. Chiamerà BeginEdit su qualsiasi oggetto di implementazione quando modifichi i dati in qualsiasi controllo associato. Puoi quindi chiamare EndEdit / CancelEdit su BindingSource e lo passerà al tuo oggetto. Il passaggio a una riga diversa chiamerà anche EndEdit.


Attualmente con il mio approccio List <T> la chiamata a CancelEdit non restituirà l'elemento modificato al suo stato originale, quindi perché uso Clone (). Stai dicendo che una lista vincolante lo gestirà per me?
Jon,

3
No, una BindingList non ha nulla a che fare con quella funzionalità. BindingSource chiama semplicemente CancelEdit sull'oggetto corrente indipendentemente dal tipo di elenco sottostante. Non c'è niente nel framework che implementa automaticamente il controllo delle versioni degli oggetti per oggetti semplici. È possibile utilizzare DataTables / DataRows, che conservano una copia originale dei dati solo per questo scopo.
Alex J

Dici che i controlli devono sapere quando l'elenco cambia, puoi spiegare ulteriormente? Ho un modulo con un datagridview e poi un altro modulo da quello con dati popolati. Devo preoccuparmi di quello che dici in questa faccenda?
Jon,

Ad esempio, DataGrid deve sapere quando gli elementi vengono aggiunti alla tua lista per poter aggiungere una nuova riga. Per questo utilizza l'evento ListChanged di BindingList. Se dovessi associare la griglia direttamente a un List <T>, non avresti l'evento e la griglia non sarebbe in grado di sapere quando hai modificato l'elenco. Non devi preoccuparti di questo nel tuo scenario perché BindingSource avvolge List <T> in un BindingList per te. Finché lavori con BindingSource e non con l'elenco stesso, i controlli rimarranno sincronizzati.
Alex J

Esiste una soluzione alternativa per utilizzare BindingList nell'interfaccia utente di WPF (nel modo mvvm)? Posso avvolgere l'elenco di rilegatura in una raccolta osservabile?
Lance

12

Un BindingList consente l'associazione di dati bidirezionale usando eventi, un List non genera eventi quando la sua raccolta cambia.

Non penso che risolverà il tuo problema particolare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.