Se ObservableCollectionpuede actualizar desde UI exactamente como cualquier colección. La verdadera diferencia es bastante sencilla:
ObservableCollection<T>implementa INotifyCollectionChangedque proporciona notificación cuando se cambia la colección (adivinó ^^) Permite que el motor de enlace actualice la IU cuando ObservableCollectionse actualiza.
Sin embargo, BindingList<T>implementos IBindingList.
IBindingListproporciona 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 BindingListretransmite notificaciones de cambio de elementos cuando se implementan sus elementos INotifyPropertyChanged. Si un artículo genera un PropertyChangedevento, BindingListlo recibirá y aumenta un ListChangedEventcon ListChangedType.ItemChangedy OldIndex=NewIndex(si un artículo fue reemplazado OldIndex=-1). ObservableCollectionno retransmite notificaciones de artículos.
Tenga en cuenta que en Silverlight, BindingListno está disponible como una opción: sin embargo, puede usar ObservableCollectionsy ICollectionView(y IPagedCollectionViewsi no recuerdo mal).
BindingListobsoleto?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
AddNewse llama,BindingList<T>busca el elemento agregado mediante unaIndexOfbúsqueda. Y siTimplementaINotifyPropertyChangedel í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 unaIBindingListimplementación personalizada con un costo de búsqueda O (1)) puede ser más preferible.Lo completo
La
IBindingListinterfaz 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,SupportsSortingySupportsSearchingpropiedades dicen siAddNew,ApplySortyFindmé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. LaDataViewclase es un ejemplo para unaIBindingListimplementación completa ; sin embargo, no es para colecciones escritas en primer lugar. Y laBindingSourceclase en WinForms es un ejemplo híbrido: admite la clasificación si envuelve otraIBindingListimplementación, que admite la clasificación.ObservableCollection<T>ya es una implementación completa de laINotifyCollectionChangedinterfaz (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 seTtrata 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
ObservableCollectionyBindingListque es útil, y puede ser un factor de decisión sobre el tema:BindingListControlador de cambio de lista:ObservableCollectionCambio de colección:La conclusión anterior se refiere a lo
INotifyPropertyChangedimplementado en las clases modelo. De forma predeterminada, ninguno genera el evento modificado si se cambia una propiedad en un elemento.fuente