2017-04-19 144 views
0

在我的WPF應用程序中,我有一個ComboBox,用於爲AutoCompletebox選擇ItemFilter。下面是代碼:ComboBox SelectionChanged事件火災晚

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

出於某種原因,經過予改變的所選被改變正在應用的過濾器。例如,我將組合框設置爲「全職」,列表篩選器未應用。然後,我將ComboBox設置爲「Part-Time,全時間過濾器正在應用,然後我將ComboBox設置爲」Retired「,Part Time過濾器正在應用等等等等......我已經使用了ComboBox for類似的東西之前,它通常基於目前在框中的東西,而不是在框中是什麼。我在這裏缺少什麼?

+0

什麼在這個SelectionChanged處理程序中的'e.AddedItems'? 'SearchFilter.SelectedItem'和'SearchFilter.SelectedValue'本應該已經更新了 –

回答

3

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。你給這些的內容是字符串:「兼職」等等所以然後

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

哇,反應很快。您上面的評論,提醒我使用SelectedItem代替。我對WPF相當陌生,並不熟悉MVVM。你爲什麼說它不是使用WPF的好方法?我總是樂於採取更好的方式來做事,即使它只是一個概念或我可以查找的東西。 – Pants

+0

@Pants例如,更正確的方法是通過將其ItemsSource綁定到viewmodel的集合屬性來填充ComboBox,然後'SelectedItem'將是集合中的一個項目。在這種情況下,您可以像我在更新中那樣使用'SelectedValuePath =「WhateverProperty」',然後將'SelectedValue'綁定到另一個viewmodel屬性。把你的整個項目變成一個MVVM的東西在這一點上可能會被禁止;我不想對此過於吝嗇。 –

+0

作爲一個工作項目,他們想要一些快速而骯髒的工作,可能有點過分,但沒有理由不改善我前進的方式,如果時間允許,最後可能會收拾。我會給你一些想法。乾杯! – Pants