2010-05-21 25 views
40

El siguiente código funciona como era de esperar: MyProperty en el modelo se actualiza cuando el usuario selecciona un nuevo elemento en el menú desplegable.ComboBox SelectedItem vs SelectedValue

comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true, 
DataSourceUpdateMode.OnPropertyChanged); 

A continuación, sin embargo, no funciona de la misma manera y la actualización del modelo no se activa hasta que el foco de entrada se cambia a otro control en el formulario:

comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, 
DataSourceUpdateMode.OnPropertyChanged); 

¿Alguien sabe por qué ? Ni siquiera sé por dónde empezar a investigar la causa. Los indicadores en la dirección correcta para iniciar la investigación o una explicación directa serían igualmente apreciados.

Aparte: para mis propósitos, que terminó uniéndose a ambos SelectedItem y SelectedValue. De esta forma obtengo actualizaciones de modelo instantáneas basadas en cambios de UI (a través del enlace SelectedValue) y actualizaciones de UI basadas en cambios de modelo programáticos (mediante el enlace SelectedItem).

Respuesta

36

Los ComboBox hereda de control desde el control ListControl.

La propiedad SelectedItem es un miembro propio del control ComboBox. El evento que se dispara sobre el cambio es ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

Se produce cuando el elemento seleccionado ha cambiado y que el cambio se muestra en el cuadro combinado.

La propiedad SelectedValue se hereda del control ListControl. Como tal, esta propiedad activará el evento ListControl.SelectedValueChanged.

ListControl.SelectedValueChanged

se produce cuando cambia la propiedad SelectedValue.

Dicho esto, no dispararán el INotifyPropertyChanged.PropertyChanged evento lo mismo, pero lo harán de todos modos. La única diferencia está en el evento de disparo. SelectedValueChanged se activa tan pronto como se realiza una nueva selección desde la parte de la lista del ComboBox, y SelectedItemChanged se activa cuando el elemento se muestra en la sección del cuadro de texto del ComboBox.

En resumen, ambos representan algo en la lista de ComboBox. Por lo tanto, al enlazar cualquiera de las propiedades, el resultado es el mismo, ya que el evento PropertyChanged se activa en ambos casos. Y dado que ambos representan un elemento de la lista, es probable que sean tratados de la misma manera.

¿Le sirve de ayuda?

editar # 1

Suponiendo que la parte de la lista del cuadro combinado representa una propiedad (ya que no puedo confirmar ya que no escribo el control), la unión cualquiera de SelectedItem o SelectedValue afecta a la misma colección dentro del control. Luego, cuando se cambia esta propiedad, ocurre lo mismo al final. El evento INotifyPropertryPropertyChanged.PropertyChanged se activa en la misma propiedad.

2

Esta es una "característica" de larga data de los controles de lista en .NET en mi experiencia. Personalmente, me gustaría enlazar al cambio en la propiedad SelectedValue y escribir cualquier código adicional que sea necesario para solucionar esta "característica" (como tener dos propiedades, vinculando una para SelectedValue, y luego, en el conjunto de esa propiedad, actualizar el valor de SelectedItem en su código personalizado).

De todos modos, espero que ayude = D

+1

Terminé la creación de dos fijaciones - uno a uno a SelectedValue y SelectedItem y didn' Necesito cualquier código personalizado más allá de eso. :) –

+0

@Anna Me alegra oír que lo has conseguido :) :) –

5

Sospecho que la propiedad SelectedItem del ComboBox no cambia hasta que el control se ha validado (que se produce cuando el control pierde el foco), mientras que los cambios en las propiedades SelectedValue siempre que sea el usuario selecciona un artículo.

Aquí es una referencia a los eventos de foco que se producen en los controles:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx

+0

Una mejor respuesta que la mía. También es importante señalar que no podrá usar SelectedItem cuando esté vinculado a SelectedValue porque aún no se actualizará. Si mal no recuerdo, debe usar la recuperación de la colección Elementos del control de lista de SelectedIndex. –

1

SI usted quiere que Selected.Value es un trabajo necesidad do siguiente

1. Set DisplayMember 
2. Set ValueMember 
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.) 

El punto clave es del origen de datos!

0

Si queremos que se unen a un diccionario es decir

<ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
           ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key" 
           Margin="{StaticResource SmallMarginLeftBottom}"/> 

continuación SelectedItem no funcionará whilist SelectedValue se

Cuestiones relacionadas