Ai-je besoin d'une BindingSource ET d'une BindingList pour WinForms DataBinding?
Je veux afficher une liste de personnes dans un DataGridView
dans une application Windows Forms. Je veux que ma couche de service pour retourner une liste d'objets de la Personne (par exemple, IList<Person>
). J'ai envie de changements dans la liste pour être reflétée dans le DataGridView
et vice versa. Ma compréhension est que l'utilisation de la BindingSource
facilite le travail avec DataGridView
. Ma question est pour les deux sens de la liaison de données pour le travail, j'ai besoin:
//pseudo code
BindingSource.DataSource = IBindingList<Person>
ou je peux le faire:
BindingSource.DataSource = IList<Person>
Quelle est la différence? Si mes apporter des modifications à la liste de la DataGridView
être mis à jour de toute façon? Et si je dois utiliser le BindingList
il semble un peu bancale (en raison de la création d'une dépendance) pour retourner un BindingList
de ma couche de service, est-il un moyen de contourner cela?
Microsoft dit de la BindingList
(dans la section des Remarques)
http://msdn.microsoft.com/en-us/library/ms132679.aspx:
"Toutefois, les solutions typiques
programmeur utilisera une classe qui
fournit la fonctionnalité de liaison de données,
commeBindingSource
, au lieu de
directement à l'aide deBindingList<T>
."
source d'informationauteur User
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez
BindingList<T>
les modifications que vous apportez à travers la liste sous-jacente sera reflété dans les données des contrôles liés parce que BindingList déclenche un événement lorsque la liste est modifiée. La plupart des autres collections ne le font pas.Si vous utilisez une collection normale comme source de données les modifications que vous apportez à travers d'autres données liées de contrôle (ou par le biais du BindingSource) seront prises en compte, mais les changements de la collection sous-jacente directement ne sera pas.
La liaison à un
IList<Person>
ne fera que vous donner un moyen de liaison; les changements à la liste ou les éléments de la liste ne seront pas reflétées dans leDataGridView
. Vous pouvez utiliser unBindingList
ouBindingSource
pour obtenir cette fonctionnalité au lieu de cela, mais votrePerson
classe aura encore besoin de soutienINotifyPropertyChanged
ou autre chose, vous obtenez seulement la synchronisation lorsque des éléments sont ajoutés/retirés de la liste, et non pas lorsque les éléments de la liste eux-mêmes le changement.Si vous voulez éviter une dépendance sur
System.Windows.Forms
vous pouvez utiliserObservableCollection<Person>
au lieu de cela, ce qui appuie le changement nécessaire des notifications et peut donc être utilisé comme une liaison bidirectionnelle source.