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>();
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, BindingList
no está disponible como una opción: Sin embargo, puede usar ObservableCollection
s y ICollectionView
(y IPagedCollectionView
si recuerdo bien).
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.
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:
ObservableCollection
cambio de Colección:
Breve de arriba: Si se cambia una propiedad de un elemento en
BindingList
, el eventoListChanged
le dará detalles completos de propiedad (en PropertyDescriptor) yObservableCollection
no dará tú eso. En realidadObservableCollection
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.
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