c# - drop - El evento ComboBox SelectionChanged se dispara tarde



drop down list wpf (1)

Text es solo la única propiedad de SearchFilter que no se habrá actualizado en su controlador SelectionChanged (no me pregunte por qué no).

SelectedItem será bueno, SelectedValue será bueno (en su caso, ambos serán el ComboBoxItem seleccionado, no es una gran manera de usar WPF, pero yo no soy su sacerdote), y SelectedIndex .

Haremos un pequeño cambio en el XAML (ver a continuación) para que podamos obtener la cadena seleccionada de SelectedValue .

private void SearchFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //  Not sure there's any reason for this null check. 
    if (SearchFilter.SelectedValue != null)
    {
        var filter = SearchFilter.SelectedValue as String;

        switch (filter)
        {
            case "Full-Time":
                EmployeeAutoBox.ItemFilter = PersonFilter_Full;
                break;
            case "Part-Time":
                EmployeeAutoBox.ItemFilter = PersonFilter_Part;
                break;
            case "Retired":
                EmployeeAutoBox.ItemFilter = PersonFilter_Ret;
                break;
            case "Stockholder":
                EmployeeAutoBox.ItemFilter = PersonFilter_Stock;
                break;
            case "Terminated":
                EmployeeAutoBox.ItemFilter = PersonFilter_Term;
                break;
            default:
                EmployeeAutoBox.ItemFilter = PersonFilter;
                break;
        }
    }
}

XAML: el único cambio aparte de la sangría es agregar el atributo SelectedValuePath="Content" . Lo que hace es, cuando la selección cambia (y antes de que el evento se eleve), el ComboBox ahora mirará el objeto en SelectedItem , cualquiera que sea, y buscará una propiedad llamada "Contenido". Si lo encuentra, usará el valor de la propiedad Content del SelectedValue para SelectedValue . El contenido que estás dando es el de las cadenas: "Part-Time", etc. Entonces,

<ComboBox 
    Name="SearchFilter" 
    SelectedValuePath="Content"
    HorizontalAlignment="Right" 
    MinWidth="75" 
    Margin="0,3,0,3" 
    SelectionChanged="SearchFilter_SelectionChanged"
    >
    <ComboBoxItem Tag="Full-Time">Full-Time</ComboBoxItem>
    <ComboBoxItem>Part-Time</ComboBoxItem>
    <ComboBoxItem>Retired</ComboBoxItem>
    <ComboBoxItem>Stockholder</ComboBoxItem>
    <ComboBoxItem>Terminated</ComboBoxItem>
    <ComboBoxItem>None</ComboBoxItem>
</ComboBox>

En mi aplicación WPF, tengo un ComboBox que estoy usando para seleccionar un ItemFilter para un AutoCompletebox. Aquí está el código:

XAML

<ComboBox 
     Name="SearchFilter" 
     HorizontalAlignment="Right" 
     MinWidth="75" Margin="0,3,0,3" 
     SelectionChanged="SearchFilter_SelectionChanged">
          <ComboBoxItem>Full-Time</ComboBoxItem>
          <ComboBoxItem>Part-Time</ComboBoxItem>
          <ComboBoxItem>Retired</ComboBoxItem>
          <ComboBoxItem>Stockholder</ComboBoxItem>
          <ComboBoxItem>Terminated</ComboBoxItem>
          <ComboBoxItem>None</ComboBoxItem>
</ComboBox>

DO#

private void SearchFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (SearchFilter.SelectedItem != null)
        {
            if (SearchFilter.Text == "Full-Time")
            {
                EmployeeAutoBox.ItemFilter = PersonFilter_Full;
            }
            else if (SearchFilter.Text == "Part-Time")
            {
                EmployeeAutoBox.ItemFilter = PersonFilter_Part;
            }
            else if (SearchFilter.Text == "Retired")
            {
                EmployeeAutoBox.ItemFilter = PersonFilter_Ret;
            }
            else if (SearchFilter.Text == "Stockholder")
            {
                EmployeeAutoBox.ItemFilter = PersonFilter_Stock;
            }
            else if (SearchFilter.Text == "Terminated")
            {
                EmployeeAutoBox.ItemFilter = PersonFilter_Term;
            }
            else
            {
                EmployeeAutoBox.ItemFilter = PersonFilter;
            }
        }
    }

Por alguna razón, el filtro se está aplicando después de que cambié la selección se cambia. Por ejemplo, configuré el ComboBox en "Tiempo completo", el filtro de lista no se está aplicando. Luego configuro el ComboBox en "Part-Time", el filtro de tiempo completo se está aplicando. Luego configuro el ComboBox en "Retired", el filtro Part Time se está aplicando. Etc, etc ... He usado un ComboBox para cosas similares antes y generalmente funciona en función de lo que está actualmente en la caja, no de lo que estaba en la caja. ¿Qué me falta aquí?





combobox