Pregunta El evento ComboBox- SelectionChanged tiene un valor anterior, no un valor nuevo


C #, .NET 4.0, VS2010.

Nuevo en WPF. Tengo un ComboBox en mi MainWindow. Enganché el evento SelectionChanged de dicho cuadro combinado. Sin embargo, si examino el valor del cuadro combinado en el controlador de eventos, tiene el valor anterior. Esto suena más como un evento "SelectionChanging" que como un evento SelectionChanged.

¿Cómo obtengo el nuevo valor de ComboBox después de que la selección haya sucedido realmente?

Actualmente:

this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);

...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = this.MyComboBox.Text;
}

Tenga en cuenta que obtengo el mismo comportamiento si uso el objeto que se pasa en los argumentos de evento, p. e.OriginalSource.


73
2018-06-02 19:53


origen


Respuestas:


De acuerdo con MSDN, e.AddedItems:

Obtiene una lista que contiene los elementos que se seleccionaron.

Entonces podrías usar:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}

También podrías usar SelectedItem si utiliza string valores para el Items desde el sender:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (sender as ComboBox).SelectedItem as string;
}

o

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}

Ya que ambos Content y SelectedItem son objetos, un enfoque más seguro sería usar .ToString() en lugar de as string


88
2018-06-02 19:57



Utilice el evento DropDownClosed en lugar de selectionChanged si desea el valor actual del cuadro combinado.

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}

Es realmente así de simple


41
2018-04-26 21:08



El valor correcto para verificar aquí es el Item seleccionado propiedad.

Un ComboBox es un control compuesto con dos de sus partes que son:

  1. La parte de texto: el valor en esta parte corresponde a Texto propiedad del ComboBox.
  2. La parte del selector (es decir, la parte "desplegable"): el elemento seleccionado en esta parte corresponde a Item seleccionado propiedad.

Expanded ComboBox Parts

La imagen de arriba fue tomada inmediatamente después de que el ComboBox se expandió (es decir, antes de seleccionar un nuevo valor). En este punto ambos Texto y Item seleccionado son "Información", suponiendo que los elementos del ComboBox fueran cadenas. Si los ítems de ComboBox fueran todos los valores de un Enum llamado "LogLevel", Item seleccionado sería actualmente LogLevel.Info.

Cuando se hace clic en un elemento del menú desplegable, el valor de Item seleccionado se cambia y el SelectionChanged evento se plantea. los Texto propiedad no se actualiza aún, sin embargo, como el Parte de texto no se actualiza hasta después de la SelectionChanged controlador ha terminado. Esto se puede observar poniendo un punto de interrupción en el controlador y mirando el control:

ComboBox at breakpoint in SelectionChanged handler

Desde el Parte de texto no se ha actualizado en este punto, el Texto propiedad devuelve el valor seleccionado previamente.


37
2017-07-22 21:43



Esto funcionó para mí:

private void AppName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ComboBoxItem cbi = (ComboBoxItem)AppName.SelectedItem;
   string selectedText = cbi.Content.ToString();
}

10
2017-11-17 16:48



Esto funcionó para mí:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    var text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;            
}

4
2017-10-13 11:45



El siguiente evento se activa para cualquier cambio del texto en el ComboBox (cuando se cambia el índice seleccionado y cuando el texto se modifica editando también).

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />

2
2018-03-27 09:02



private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}

1
2018-04-17 12:59