Se ObservableCollection
puede actualizar desde UI exactamente como cualquier colección. La verdadera diferencia es bastante sencilla:
ObservableCollection<T>
implementa INotifyCollectionChanged
que proporciona notificación cuando se cambia la colección (adivinó ^^) Permite que el motor de enlace actualice la IU cuando ObservableCollection
se actualiza.
Sin embargo, BindingList<T>
implementos IBindingList
.
IBindingList
proporciona notificaciones sobre cambios en la colección, pero no solo eso. Proporciona un montón de funcionalidades que la interfaz de usuario puede usar para proporcionar muchas más cosas que solo actualizaciones de la interfaz de usuario de acuerdo con los cambios, como:
- Clasificación
- buscando
- Agregar a través de la fábrica (función de miembro AddNew).
- Lista de solo lectura (propiedad CanEdit)
Todas estas funcionalidades no están disponibles en ObservableCollection<T>
Otra diferencia es que BindingList
retransmite notificaciones de cambio de elementos cuando se implementan sus elementos INotifyPropertyChanged
. Si un artículo genera un PropertyChanged
evento, BindingList
lo recibirá y aumenta un ListChangedEvent
con ListChangedType.ItemChanged
y OldIndex=NewIndex
(si un artículo fue reemplazado OldIndex=-1
). ObservableCollection
no retransmite notificaciones de artículos.
Tenga en cuenta que en Silverlight, BindingList
no está disponible como una opción: sin embargo, puede usar ObservableCollection
sy ICollectionView
(y IPagedCollectionView
si no recuerdo mal).
BindingList
obsoleto?La diferencia práctica es que BindingList es para WinForms y ObservableCollection es para WPF.
Desde la perspectiva de WPF, BindingList no se admite correctamente, y nunca lo usaría realmente en un proyecto de WPF a menos que realmente tuviera que hacerlo.
fuente
La respuesta aceptada ya menciona las diferencias más importantes, como las características y las notificaciones de cambios sobre los elementos contenidos, pero hay más, que también vale la pena mencionar:
Actuación
Cuando
AddNew
se llama,BindingList<T>
busca el elemento agregado mediante unaIndexOf
búsqueda. Y siT
implementaINotifyPropertyChanged
el índice de un elemento modificado también se buscaIndexOf
(aunque no hay una nueva búsqueda siempre que el mismo elemento cambie repetidamente). Si almacena miles de elementos en la colección, entoncesObservableCollection<T>
(o unaIBindingList
implementación personalizada con un costo de búsqueda O (1)) puede ser más preferible.Lo completo
La
IBindingList
interfaz es enorme (quizás no sea el diseño más limpio) y permite a los implementadores implementar solo un subconjunto de sus características. Por ejemplo, lasAllowNew
,SupportsSorting
ySupportsSearching
propiedades dicen siAddNew
,ApplySort
yFind
métodos se pueden utilizar, respectivamente. A menudo sorprende a la gente que enBindingList<T>
sí misma no admite la clasificación. En realidad, proporciona algunos métodos virtuales que permiten que las clases derivadas agreguen las características que faltan. LaDataView
clase es un ejemplo para unaIBindingList
implementación completa ; sin embargo, no es para colecciones escritas en primer lugar. Y laBindingSource
clase en WinForms es un ejemplo híbrido: admite la clasificación si envuelve otraIBindingList
implementación, que admite la clasificación.ObservableCollection<T>
ya es una implementación completa de laINotifyCollectionChanged
interfaz (que tiene un solo evento). También tiene miembros virtuales, peroObservableCollection<T>
generalmente se deriva por la misma razón que suCollection<T>
clase base : para personalizar elementos de agregar / quitar (por ejemplo, en una colección de modelo de datos) en lugar de ajustar las características de enlace.Copiar vs envolver
Ambos
ObservableCollection<T>
yBindingList<T>
tienen un constructor, que acepta una lista ya existente. Aunque se comportan de manera diferente cuando son instanciados por otra colección:BindingList<T>
actúa como un contenedor observable para la lista proporcionada, y los cambios realizados en elBindingList<T>
se reflejarán también en la colección subyacente.ObservableCollection<T>
por otro lado, pasa una nuevaList<T>
instancia alCollection<T>
constructor base y copia los elementos de la colección original en esta nueva lista. Por supuesto, si seT
trata de un tipo de referencia, los cambios en los elementos serán visibles desde la colección original, pero la colección en sí no se actualizará.fuente
Una gran diferencia más entre eso
ObservableCollection
yBindingList
que es útil, y puede ser un factor de decisión sobre el tema:BindingList
Controlador de cambio de lista:ObservableCollection
Cambio de colección:La conclusión anterior se refiere a lo
INotifyPropertyChanged
implementado en las clases modelo. De forma predeterminada, ninguno genera el evento modificado si se cambia una propiedad en un elemento.fuente