Différence entre ObservableCollection et BindingList
Je veux connaître la différence entre ObservableCollection
et BindingList
parce que j'ai utilisé les deux pour notifier tout changement d'Ajout/Suppression dans la Source, mais je ne sais pas quand préférer l'un à l'autre.
Pourquoi choisirais-je l'une des options suivantes plutôt que l'autre?
ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();
Ou
BindingList<Employee> lstEmp = new BindingList<Employee>();
3 réponses
Un ObservableCollection
peut être mis à jour à partir de l'INTERFACE utilisateur exactement comme n'importe quelle collection. La vraie différence est plutôt simple:
ObservableCollection<T>
implémente 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 ObservableCollection
est mis à jour.
Cependant, BindingList<T>
implémente IBindingList
.
IBindingList
fournit une notification sur les modifications de collection, mais pas seulement cela. Il fournit tout un tas de fonctionnalités qui peuvent être utilisées par le UI pour fournir beaucoup plus de choses que seules les mises à jour de L'interface utilisateur en fonction des changements, comme:
- Tri
- recherche
- ajouter par usine (AddNew membre fonction).
- liste en lecture seule (Propriété CanEdit)
Toutes ces fonctionnalités ne sont pas disponibles dans ObservableCollection<T>
Une autre différence est que BindingList
transmet les notifications de modification d'élément lorsque ses éléments implémentent INotifyPropertyChanged
. Si un élément déclenche un événement PropertyChanged
, le BindingList
recevra un événement déclenche un ListChangedEvent
avec ListChangedType.ItemChanged
et OldIndex=NewIndex
(si un élément a été remplacé, OldIndex=-1
). ObservableCollection
ne relaie pas les notifications d'éléments.
Notez que dans Silverlight, BindingList
n'est pas disponible en option: Vous pouvez cependant utiliser les ObservableCollection
s et ICollectionView
(et IPagedCollectionView
, si je me souviens bien).
La différence pratique est que BindingList est pour WinForms, et ObservableCollection est pour WPF.
D'un point de vue WPF, BindingList n'est pas correctement supporté, et vous ne l'utiliseriez jamais vraiment dans un projet WPF sauf si vous le deviez vraiment.
Encore une grande différence entre ObservableCollection
et BindingList
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:
Bref de ce qui précède: si une propriété d'un élément est modifiée dans
BindingList
, l'événementListChanged
vous donnera des détails complets de la propriété (dans PropertyDescriptor) etObservableCollection
ne donnera pas vous qui. EffectivementObservableCollection
ne déclenche pas l'événement change pour une propriété modifié dans un élément.
La conclusion ci-dessus concerne INotifyPropertyChanged
mis en œuvre dans les classes de modèle. Par défaut, none déclenche l'événement modifié si une propriété est modifiée dans un élément.