2017-04-19 7 views
0

私のWPFアプリケーションでは、AutoCompleteboxのItemFilterを選択するために使用しているComboBoxがあります。ここでコードである:いくつかの理由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; 
      } 
     } 
    } 

Iは、選択が変更された変更後、フィルタが適用されています。たとえば、ComboBoxを「フルタイム」に設定すると、リストフィルタは適用されません。 ComboBoxを "Part-Time"に設定すると、フルタイムフィルタが適用されます。次に、 "Retired"にコンボボックスを設定し、Part Timeフィルタを適用しています。私はここに何が入っていないのですか?

+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プロパティの値が使用されます。あなたが提供しているコンテンツは文字列です:「パートタイム」など

<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

関連する問題