Un ObservableCollection
peut être mis à jour à partir de l'interface utilisateur exactement comme n'importe quelle collection. La vraie différence est assez simple:
ObservableCollection<T>
implements INotifyCollectionChanged
qui fournit une notification lorsque la collection est modifiée (vous l'avez deviné ^^) Il permet au moteur de liaison de mettre à jour l'interface utilisateur lorsque le ObservableCollection
est mis à jour.
Cependant, BindingList<T>
implémente IBindingList
.
IBindingList
fournit une notification sur les changements de collection, mais pas seulement. Il fournit tout un tas de fonctionnalités qui peuvent être utilisées par l'interface utilisateur pour fournir beaucoup plus de choses que les seules mises à jour de l'interface utilisateur en fonction des changements, comme:
- Tri
- Recherche
- Ajouter via l'usine (fonction membre AddNew).
- Liste en lecture seule (propriété CanEdit)
Toutes ces fonctionnalités ne sont pas disponibles dans ObservableCollection<T>
Une autre différence est que les BindingList
relais relaient les notifications de changement d'élément lorsque ses éléments sont implémentés INotifyPropertyChanged
. Si un élément déclenche un PropertyChanged
événement, le BindingList
recevra un déclenche un ListChangedEvent
avec ListChangedType.ItemChanged
et OldIndex=NewIndex
(si un élément a été remplacé, OldIndex=-1
). ObservableCollection
ne transmet pas les notifications d'articles.
Notez que dans Silverlight, BindingList
n'est pas disponible en option: vous pouvez cependant utiliser ObservableCollection
s et ICollectionView
(et IPagedCollectionView
si je me souviens bien).
BindingList
obsolète?La différence pratique est que BindingList est pour WinForms et ObservableCollection est pour WPF.
Du point de vue WPF, BindingList n'est pas correctement pris en charge, et vous ne l'utiliseriez jamais vraiment dans un projet WPF, sauf si vous en avez vraiment besoin.
la source
Les différences les plus importantes telles que les fonctionnalités et les notifications de modification des éléments contenus sont déjà mentionnées par la réponse acceptée, mais il y en a d'autres, qui méritent également d'être mentionnées:
Performance
Lorsque
AddNew
est appelé,BindingList<T>
recherche l'élément ajouté par uneIndexOf
recherche. Et siT
implémente,INotifyPropertyChanged
l'index d'un élément modifié est également recherché parIndexOf
(bien qu'il n'y ait pas de nouvelle recherche tant que le même élément change à plusieurs reprises). Si vous stockez des milliers d'éléments dans la collection, alorsObservableCollection<T>
(ou uneIBindingList
implémentation personnalisée avec un coût de recherche O (1)) peut être plus préférable.Complétude
L'
IBindingList
interface est énorme (peut-être pas la conception la plus propre) et permet aux implémenteurs d'implémenter uniquement un sous-ensemble de ses fonctionnalités. Par exemple, lesAllowNew
,SupportsSorting
et lesSupportsSearching
propriétés indiquent siAddNew
,ApplySort
etFind
méthodes peuvent être utilisées, respectivement. Cela surprend souvent les gens quiBindingList<T>
ne supportent pas le tri. En fait, il fournit des méthodes virtuelles permettant aux classes dérivées d'ajouter les fonctionnalités manquantes. LaDataView
classe est un exemple pour uneIBindingList
implémentation complète ; cependant, ce n'est pas pour les collections typées en premier lieu. Et laBindingSource
classe dans WinForms est un exemple hybride: elle prend en charge le tri si elle encapsule une autreIBindingList
implémentation, qui prend en charge le tri.ObservableCollection<T>
est déjà une implémentation complète de l'INotifyCollectionChanged
interface (qui n'a qu'un seul événement). Il a également des membres virtuels maisObservableCollection<T>
est généralement dérivé pour la même raison que saCollection<T>
classe de base : pour personnaliser l'ajout / la suppression d'éléments (par exemple dans une collection de modèles de données) plutôt que pour ajuster les fonctions de liaison.Copie vs habillage
Les deux
ObservableCollection<T>
etBindingList<T>
un constructeur qui accepte une liste déjà existante. Bien qu'ils se comportent différemment lorsqu'ils sont instanciés par une autre collection:BindingList<T>
agit comme un wrapper observable pour la liste fournie, et les modifications effectuées sur leBindingList<T>
seront également répercutées sur la collection sous-jacente.ObservableCollection<T>
d'autre part, passe une nouvelleList<T>
instance auCollection<T>
constructeur de base et copie les éléments de la collection d'origine dans cette nouvelle liste. Bien sûr, siT
c'est un type de référence, les modifications sur les éléments seront visibles depuis la collection d'origine mais la collection elle-même ne sera pas mise à jour.la source
Une plus grande différence entre
ObservableCollection
etBindingList
qui est pratique et peut être un facteur de décision d'enchère sur le sujet:BindingList
Gestionnaire de changement de liste:ObservableCollection
Changement de collection:La conclusion ci-dessus concerne l'
INotifyPropertyChanged
implémentation dans les classes de modèle. Par défaut, aucun ne déclenche l'événement modifié si une propriété est modifiée dans un élément.la source