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?