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>();
212
demandé sur Olivier Jacot-Descombes 2010-11-26 13:57:38

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 ObservableCollections et ICollectionView (et IPagedCollectionView, si je me souviens bien).

262
répondu Eilistraee 2013-01-18 11:59:12

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.

20
répondu Dean Chalk 2010-11-26 11:34:25

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:

BindingList Changement De Liste

ObservableCollection changement de Collection:

ObervableCollection Collection Modifiée

Bref de ce qui précède: si une propriété d'un élément est modifiée dans BindingList, l'événement ListChanged vous donnera des détails complets de la propriété (dans PropertyDescriptor) et ObservableCollection ne donnera pas vous qui. Effectivement ObservableCollection 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.

1
répondu Kylo Ren 2016-02-12 05:32:42