List <T> vs BindingList <T> Ventajas / Desventajas

91

¿Alguien puede describir cuál es la diferencia entre los dos para mi proyecto?

Actualmente tengo un List<MyClass>y configuro BindingSource en eso y un DataGridView en BindingSource.

Lo he implementado, IEditableObjectpor lo que cuando se llama a CancelEdit, revierto mi objeto a lo que era con unMemberwise.Clone()

¿Cambiar mi Lista a una BindingList resolverá algo de esto y cuáles son las ventajas de usar una BindingList?

Jon
fuente

Respuestas:

123

A List<>es simplemente una matriz de cambio de tamaño automático, de elementos de un tipo determinado, con un par de funciones auxiliares (por ejemplo: ordenar). Son solo los datos y es probable que los utilice para ejecutar operaciones en un conjunto de objetos en su modelo.

A BindingList<>es un envoltorio alrededor de una lista escrita o una colección, que implementa la IBindingListinterfaz. Esta es una de las interfaces estándar que admiten el enlace de datos bidireccional. Funciona implementando el ListChangedevento, que se genera cuando agrega, elimina o establece elementos. Los controles enlazados escuchan este evento para saber cuándo actualizar su pantalla.

Cuando establece un DataSource de BindingSource en a List<>, crea internamente un BindingList<>para envolver su lista. Es posible que desee envolver previamente su lista con un BindingList<>usted mismo si desea acceder a ella fuera de BindingSource, pero por lo demás es lo mismo. También puede heredar de BindingList<>para implementar un comportamiento especial al cambiar elementos.

IEditableObjectes manejado por BindingSource. Llamará a BeginEdit en cualquier objeto de implementación cuando cambie los datos en cualquier control enlazado. Luego puede llamar a EndEdit / CancelEdit en BindingSource y lo pasará a su objeto. Moverse a una fila diferente también llamará a EndEdit.

Alex J
fuente
Actualmente, con mi enfoque List <T>, llamar a CancelEdit no devolverá el elemento que se está editando a su estado original, por lo que utilizo Clone (). ¿Estás diciendo que una lista de encuadernación se encargará de eso?
Jon
3
No, BindingList no tiene nada que ver con esa funcionalidad. BindingSource simplemente llama a CancelEdit en el objeto actual independientemente del tipo de lista subyacente. No hay nada en el marco que implemente automáticamente el control de versiones de objetos para objetos simples. Puede utilizar DataTables / DataRows, que conservan una copia original de los datos solo para este propósito.
Alex J
Dice que los controles necesitan saber cuándo cambia la lista, ¿puede explicar más? Tengo un formulario con una vista de cuadrícula de datos y luego otro formulario con datos completos. ¿Debo preocuparme por lo que dice al respecto?
Jon
Por ejemplo, DataGrid necesita saber cuándo se agregan elementos a su lista para agregar una nueva fila. Para eso, usa el evento ListChanged de BindingList. Si estuviera vinculando la cuadrícula directamente a una List <T>, no tendría el evento y la cuadrícula no podría saber cuándo cambió la lista. No tiene que preocuparse por ello en su escenario porque BindingSource envuelve List <T> en una BindingList para usted. Siempre que trabaje con BindingSource y no con la lista en sí, los controles permanecerán sincronizados.
Alex J
¿Hay alguna solución para usar BindingList en la interfaz de usuario de WPF (al estilo mvvm)? ¿Puedo envolver la lista de enlaces a una colección observable?
Lance
12

Una BindingList permite la vinculación de datos bidireccional mediante el uso de eventos, una Lista no activa eventos cuando cambia su colección.

No creo que solucione su problema particular.

Gerrie Schenck
fuente