¿Por qué los widgets se actualizan simultáneamente cuando se asignan a la misma fuente de datos?

Tengo una pregunta muy básica sobre las fuentes de datos de Windows Forms.

Si asigno la misma fuente de datos de objeto a un cuadro combinado y un cuadro de lista en el mismo formulario, observo un comportamiento interesante de la interfaz de usuario: cuando cambio el elemento en un cuadro combinado (o cuadro de lista), el otro control selecciona el mismo elemento.

No tengo código adicional para este comportamiento de la interfaz de usuario, así que me pregunto cómo funciona.

 var persons = new List<Person>
                              {
                                  new Person {Id = 1, Age = 10, Name = "Alex"},
                                  new Person {Id = 2, Age = 12, Name = "Boris"},                                 
                              };

   //     ListBox 
   lbPersons.DisplayMember = "Name";           
   lbPersons.DataSource = persons;

    //    ComboBox
    cbPersons.DisplayMember = "Name";
    cbPersons.DataSource = persons; 

Por favor, explique cómo se cambia sincrónicamente el elemento seleccionado de un control.

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

Encontré algunos problemas similares en la web. No entiendo completamente cómo funciona esto, pero haré mi mejor esfuerzo:

Cuando tiene un enlace de varios controles a la misma fuente de datos, utilizan el mismo contexto de enlace. Por lo tanto, cambiar el elemento seleccionado en un control cambiará el elemento seleccionado en el otro control.

En cambio, cuando vincule las fuentes de datos, asigne a cada una un nuevo BindingContext:

lbPersons.DisplayMember = "Name";           
lbPersons.DataSource = persons;
lbPersons.BindingContext = new BindingContext();

cbPersons.DisplayMember = "Name";
cbPersons.DataSource = persons; 
cbPersons.BindingContext = new BindingContext();

Encontré esta información en un foro (enlace a continuación) donde confirman el problema y tienen una solución. Necesito leer más sobre esto, pero se puede encontrar más información en el msdn en:

http://bytes.com/topic/c-sharp/answers/850851-multiple-controls-bound-same-data-source http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingcontext.aspx

EDITAR según:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.bindingcontext(v=vs.71).aspx

El objeto BindingContext de un Control se usa para devolver un único objeto BindingManagerBase para todos los controles enlazados a datos contenidos por el Control. El objeto BindingManagerBase mantiene sincronizados todos los controles vinculados al mismo origen de datos. Por ejemplo, establecer la propiedad Posición de BindingManagerBase especifica el elemento de la lista subyacente al que apuntan todos los controles enlazados a datos.

También:

(http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingcontext.bindingcontext(v=vs.71).aspx)

Por ejemplo, si tiene dos objetos BindingManagerBase (de dos objetos BindingContext diferentes), puede establecer las propiedades de posición de cada BindingManagerBase en valores diferentes, lo que hace que cada conjunto de controles enlazados a datos muestre valores diferentes de la misma fuente de datos.

respondido 09 mar '12, 17:03

Parece (pero no estoy seguro) que hay 'un administrador' detrás de las cortinas que controla el valor de DataSource asignado para todos los controles. 'manager' rastrea todos los eventos modificados de selectedItems y cambia SelectedItems para controles que tienen el mismo valor de DataSource asignado. Quién sabe para qué sirve y cómo se puede desactivar para toda la aplicación. - Andres Florko

@AndrewFlorko ver mi edición. ¿El código anterior no soluciona el problema? - ImGreg

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.