c# - L'evento ComboBox SelectionChanged scocca in ritardo



wpf combobox sample (1)

Text è solo l'unica proprietà di SearchFilter che non è stata aggiornata nel tuo gestore SelectionChanged (non chiedermi perché no).

SelectedItem sarà buono, SelectedValue sarà buono (nel tuo caso, entrambi saranno i ComboBoxItem selezionati - non un ottimo modo per usare WPF, ma non sono il tuo prete), e SelectedIndex .

Faremo una piccola modifica allo XAML (vedi sotto) in modo che possiamo ottenere la stringa selezionata da 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: l'unica modifica rispetto all'indentazione è l'aggiunta dell'attributo SelectedValuePath="Content" . Ciò che accade è, quando la selezione cambia (e prima che l'evento venga generato), il ComboBox ora guarderà l'oggetto in SelectedItem , qualunque esso sia, e cercherà una proprietà su di esso chiamata "Contenuto". Se lo trova, utilizzerà il valore della proprietà Content di SelectedValue per SelectedValue . Il contenuto che stai dando è quello delle stringhe: "Part-Time", ecc. Quindi

<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>

Nella mia applicazione WPF, ho un ComboBox che sto usando per selezionare un ItemFilter per un AutoCompletebox. Ecco il codice:

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>

C #

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;
            }
        }
    }

Per qualche motivo, il filtro viene applicato dopo che la modifica è stata modificata. Ad esempio, ho impostato il ComboBox su "Full-Time", il filtro dell'elenco non viene applicato. Poi ho impostato il ComboBox su "Part-Time", il filtro Full-Time viene applicato, quindi ho impostato il ComboBox su "Retired", il filtro Part Time viene applicato, ecc., Ecc ... Ho usato un ComboBox per cose simili prima e di solito funziona in base a ciò che è attualmente nella scatola, non cosa c'era nella scatola. Cosa mi manca qui?





combobox