Diferencia entre ObservableCollection y BindingList


Quiero saber la diferencia entre ObservableCollection y BindingList porque he usado ambos para notificar cualquier cambio de agregar/eliminar en la Fuente, pero en realidad no sé cuándo preferir uno sobre el otro.

¿Por qué elegiría uno de los siguientes sobre el otro?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

O

BindingList<Employee> lstEmp = new BindingList<Employee>();
Author: Olivier Jacot-Descombes, 2010-11-26

3 answers

Un ObservableCollection se puede actualizar desde la interfaz de usuario exactamente como cualquier colección. La verdadera diferencia es bastante directa:

ObservableCollection<T> implementa INotifyCollectionChanged que proporciona notificación cuando se cambia la colección (adivinó ^^) Permite que el motor de enlace actualice la interfaz de usuario cuando se actualiza ObservableCollection.

Sin embargo, BindingList<T> implementa IBindingList.

IBindingList proporciona notificación sobre los cambios en la recopilación, pero no solo eso. Proporciona un montón de funcionalidad que puede ser utilizado por el Interfaz de usuario para proporcionar muchas más cosas que solo las actualizaciones de interfaz de usuario de acuerdo a los cambios, como:

  • Ordenando
  • Buscando
  • Agregar a través de fábrica (función miembro AddNew).
  • Readonly list (propiedad CanEdit)

Todas estas funcionalidades no están disponibles en ObservableCollection<T>

Otra diferencia es que BindingList transmite notificaciones de cambio de ítems cuando sus ítems implementan INotifyPropertyChanged. Si un objeto sube un evento PropertyChanged, el BindingList recibirá un aumento a ListChangedEvent por ListChangedType.ItemChanged y OldIndex=NewIndex (si se sustituye un elemento, OldIndex=-1). ObservableCollection no transmite notificaciones de elementos.

Tenga en cuenta que en Silverlight, BindingListno está disponible como una opción: Sin embargo, puede usar ObservableCollection s y ICollectionView (y IPagedCollectionView si recuerdo bien).

 262
Author: Eilistraee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-18 11:59:12

La diferencia práctica es que BindingList es para WinForms, y ObservableCollection es para WPF.

Desde la perspectiva de WPF, BindingList no está soportado correctamente, y nunca lo usarías en un proyecto WPF a menos que realmente tuvieras que hacerlo.

 20
Author: Dean Chalk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-26 11:34:25

Otra gran diferencia entre ObservableCollection y BindingList que es útil, y puede ser un factor de decisión de la oferta en el tema:

BindingList Manejador de Cambios de Lista:

BindingList Cambio de Lista

ObservableCollection cambio de Colección:

Colección ObervableCollection Cambiada

Breve de arriba: Si se cambia una propiedad de un elemento en BindingList, el evento ListChanged le dará detalles completos de propiedad (en PropertyDescriptor) y ObservableCollection no dará tú eso. En realidad ObservableCollection no generará un evento de cambio para una propiedad cambiado en un artículo.

Las conclusiones anteriores se refieren a INotifyPropertyChanged implementadas en clases modelo. De forma predeterminada, none genera el evento cambiado si se cambia una propiedad en un elemento.

 1
Author: Kylo Ren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-12 05:32:42