ComboBox SelectionChanged事件触发较晚

在我的WPF应用程序中,我有一个ComboBox,我用它来为AutoCompletebox选择一个ItemFilter。 这是代码:

XAML

 Full-Time Part-Time Retired Stockholder Terminated None  

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

出于某种原因,在我更改选择后更改了filter。 例如,我将ComboBox设置为“全时”,未应用列表filter。 然后我将ComboBox设置为“Part-Time,正在应用全时filter。然后我将ComboBox设置为”Retired“,正在应用Part Timefilter。等等…我使用了ComboBox for以前类似的东西,它通常根据盒子里的东西而不是盒子里的东西来工作。我在这里缺少什么?

Text只是SearchFilter的唯一属性,在SelectionChanged处理程序中不会更新(不要问我为什么不这样做)。

SelectedItem会很好, SelectedValue会很好(在你的情况下,两者都将是选中的ComboBoxItem – 不是使用WPF的好方法,但我不是你的牧师)和SelectedIndex

我们将对XAML做一个小的改动(见下文),这样我们就可以从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:除了缩进之外唯一的变化是添加SelectedValuePath="Content"属性。 这样做的是,当选择发生变化时(以及在引发事件之前),ComboBox现在将查看SelectedItem中的对象,无论它是什么,并在其上查找名为“Content”的属性。 如果发现,它将使用SelectedItemContent属性的值为SelectedValue 。 你给出的内容是字符串:“兼职”,等等

  Full-Time Part-Time Retired Stockholder Terminated None