2011-01-13 21 views
10

Quiero mostrar una lista de personas en un DataGridView en una aplicación de Windows Forms. Quiero que mi capa de servicio devuelva una lista de objetos Persona (por ejemplo, IList<Person>). Quiero que los cambios en la lista se reflejen en el DataGridView y viceversa. Mi entendimiento es que usar el BindingSource facilita el trabajo con DataGridView. Mi pregunta es para el enlace de datos bidireccional para trabajar, necesito:¿Necesito un BindingSource AND a BindingList para WinForms DataBinding?

//pseudo code 
BindingSource.DataSource = IBindingList<Person> 

o puede hacer:

BindingSource.DataSource = IList<Person> 

Cuál es la diferencia? Si mi make realiza cambios en la lista, ¿se actualizará el DataGridView de cualquier manera? Y si tengo que usar el BindingList, parece un poco inestable (debido a la creación de una dependencia) devolver un BindingList desde mi capa de servicio, ¿hay alguna forma de evitarlo?

Microsoft dice de la BindingList (en la sección Comentarios) http://msdn.microsoft.com/en-us/library/ms132679.aspx:

"Sin embargo, las soluciones típicas programador utilizar una clase que proporciona funcionalidad de enlace de datos, como BindingSource, en lugar de directamente usando BindingList<T>. "

Respuesta

3

Si usa BindingList<T>, los cambios que realice a través de la lista subyacente se reflejarán en los controles de datos enlazados porque BindingList genera un evento cuando se cambia la lista. La mayoría de las otras colecciones no.

Si utiliza una colección normal como fuente de datos, los cambios que realice a través de otros controles vinculados a datos (oa través de BindingSource) seguirán reflejándose, pero los cambios en la colección subyacente directamente no lo reflejarán.

+0

Parte de mi confusión fue que algunas personas parecían sugerir que no necesitabas utilizar una BindingList para obtener una unión de datos bidireccional siempre que estuvieras utilizando un BindingSource. Pero supongo que lo que dices es que eso solo es cierto si solo modificas la lista a través de BindingSource. – User

10

El enlace a un IList<Person> solo le dará un enlace de un solo sentido; los cambios en la lista o los elementos de la lista no se reflejarán en el DataGridView. Puede usar un BindingList o BindingSource para obtener esta funcionalidad, pero su clase Person aún necesitará admitir INotifyPropertyChanged o de lo contrario solo obtendrá la sincronización cuando los elementos se agreguen/eliminen a/de la lista, no cuando cambien los elementos de la lista.

Si desea evitar una dependencia en System.Windows.Forms, puede usar ObservableCollection<Person> en su lugar; esto admite las notificaciones de cambio necesarias y, por lo tanto, se puede usar como una fuente de enlace bidireccional.

+6

A menos que esté usando .NET 4, ObservableCollection conlleva una dependencia aún más onerosa porque está definida en un ensamblado WPF (WindowsBase). Solo se movió a System.dll en .NET 4. – Josh