Wpf - ComboBox.SelectionChanged

Descripción general

Explicación de porqué en un control Wpf - ComboBox., no coincide el valor de la [propiedad Text], con el valor seleccionado [Porpiedad SelectedItem] cuando las leemos desde un controlador del evento [SelectionChanged]

[TOC] Tabla de Contenidos


↑↑↑

Introducción

[Propiedad ComboBox.Text] Obtiene o establece el texto asociado al control. Es decir, el valor visible en el ComboBox.

[Propiedad ComboBox.SelectedItem] Obtiene o establece el elemento seleccionado actualmente en el elemento ComboBox.

[Evento Selector.SelectionChanged] Se produce cuando cambia la selección de un control que contiene un Selector.


↑↑↑

¿Cuál es el problema?

Pues que al interceptar un evento [SelectionChanged], y obtener el valor del ComboBox con la propiedad [Text], se obtiene el valor seleccionado viejo, no el que acabamos de seleccionar.

Una observación importante: Este problema ocurre cuando usamos el escuchador de eventos. Si usamos un Binding de la propiedad [Text] con otro control, este problema no aparece y todo funciona correctamente.


↑↑↑

¿Por qué ocurre esto?

[Leido, Inspirado, copiado y traducido de este texto original]

Un ComboBox es un control compuesto de dos partes:

Antes de seleccionar un elemento

La imagen de anterior está tomada inmediatamente después de que el ComboBox se expandiera, justo después de mostrar el menú desplegable, y antes de seleccionar un nuevo valor. En este punto [Text] y [SelectedItem] tienen el mismo valor.

Por ejemplo, tomando los valores que aparecen en la imagen, y por simplificar, suponiendo que los elementos del ComboBox sean cadenas. El valor de [Text] = Info, y el valor de [SelectedItem] = Info

Cuando se presiona un elemento en el menú desplegable, se cambia el valor de [SelectedItem] y provoca el evento [SelectionChanged]. Pero la propiedad [Text] no se actualiza todavía, sino que el control espera para actualizarla a que acabe el evento [SelectionChanged], por esa razón, si dentro del código del evento llamamos a la propiedad [Text], obtendremos el valor "antiguo" de esta propiedad. Este comportamiento, puede observarse colocando un punto de interrupción en el controlador y mirando el control

Puesto que la Parte del texto no ha sido actualizado en este punto, la propiedad Text devuelve el valor seleccionado previamente.

Despues de seleccionar un elemento

↑↑↑

la solución

En resumen. Si queremos obtener el valor nuevo, seleccionado en el ComboBox dentro de un evento [SelectionChanged]. Tendremos que usar el valor [SelectedItem] en lugar de [Text].

Un ejemplo

Private Sub uc_OrdenarFotosDos_SelectionChanged(
            sender As Object, e As SelectionChangedEventArgs)
        ' Obtener el ComboBox que dispara el evento
        ' en realidad no es necesario, se puede usar directamente 
        ' el combo llamándolo por su [x: Name]
        Dim ojbComboBox As ComboBox = CType(sender, ComboBox)
        ' de esta forma obtendré el valor anterior (viejo)  del ComboBox
        'Me.textBoxResultado.Text = Me.uc_OrdenarFotosDos.Text
        ' Obtener el valor de la propiedad SelectedItem.
        Dim value As String = CType(ojbComboBox.SelectedItem, String)
        ' mostrarla, (por ejemplo) en un textBox :-)
        Me.textBoxResultado.Text = value
End Sub

↑↑↑

A.2.Enlaces

[Para saber mas]
Wpf – Cargar en un ListBox una enumeración del sistema
Wpf – Cargar en un ListBox/ComboBox una enumeración creada por nosotros
Wpf – Cargar una colección en una enumeración
Wpf – Extender un control ComboBox que cargue una enumeración
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]