2011-01-13 14 views
10

Desidero visualizzare un elenco di persone in un DataGridView in un'app Windows Form. Voglio che il mio livello di servizio restituisca un elenco di oggetti Person (ad es., IList<Person>). Voglio che le modifiche nell'elenco si riflettano nello DataGridView e viceversa. La mia comprensione è che l'utilizzo di BindingSource facilita il lavoro con DataGridView. La mia domanda è per il doppio senso l'associazione dati per lavorare, ho bisogno:Ho bisogno di BindingSource AND BindingList per DataBinding di WinForms?

//pseudo code 
BindingSource.DataSource = IBindingList<Person> 

o posso fare:

BindingSource.DataSource = IList<Person> 

Qual è la differenza? Se apporti modifiche all'elenco, lo DataGridView verrà aggiornato in entrambi i casi? E se devo usare lo BindingList, sembra un po 'traballante (a causa della creazione di una dipendenza) per restituire uno BindingList dal mio livello di servizio, c'è un modo per aggirare questo?

Microsoft dice del BindingList (nella sezione Osservazioni) http://msdn.microsoft.com/en-us/library/ms132679.aspx:

"Tuttavia, le soluzioni tipiche programmatore utilizzare una classe che fornisce i dati funzionalità vincolante, quali BindingSource, invece di utilizzando direttamente BindingList<T>. "

risposta

3

Se si utilizza BindingList<T> cambia allora che si fanno attraverso la lista sottostante si rifletterà nei dati controlli associati a causa BindingList genera un evento quando la lista viene modificato. La maggior parte delle altre collezioni no.

Se si utilizza una raccolta normale come origine dati, le modifiche apportate tramite altri controlli con associazione a dati (o tramite BindingSource) verranno comunque riflesse, ma le modifiche alla raccolta sottostante non lo saranno.

+0

Parte della mia confusione era che alcune persone sembravano suggerire che non era necessario utilizzare un BindingList per ottenere un collegamento bidirezionale finché si utilizzava BindingSource. Ma suppongo che quello che stai dicendo è vero solo se si modifica l'elenco solo tramite BindingSource. – User

10

Il collegamento a un IList<Person> fornisce solo un collegamento unidirezionale; le modifiche all'elenco o agli elementi dell'elenco non si rifletteranno nello DataGridView. È possibile utilizzare uno BindingList o BindingSource per ottenere questa funzionalità, ma la classe Person dovrà ancora supportare INotifyPropertyChanged oppure si otterrà la sincronizzazione solo quando gli elementi vengono aggiunti/rimossi a/dall'elenco, non quando cambiano gli elementi dell'elenco.

Se si desidera evitare una dipendenza su System.Windows.Forms, è possibile utilizzare invece ObservableCollection<Person>; questo supporta le necessarie notifiche di modifica e può quindi essere utilizzato come fonte di associazione a due vie.

+6

A meno che non stia usando .NET 4, ObservableCollection ha una dipendenza ancora più pesante perché è definito in un assembly WPF (WindowsBase). È stato spostato su System.dll in .NET 4. – Josh