2016-11-28 8 views
0

まず最初に、悪い英語のために申し訳ありません、それは私の母国語ではありません。WPF-comboboxをフィルタリングする方法は?

私は現在、コンボボックスにリストアップしたい人のリストがあるプロジェクトに取り組んでいます。 私はコンボボックスをフィルタリングして、リストされた人だけが検索するようにします。

たとえば、コンボボックスの「Joh」を入力すると、「John」、「Johann」などの「Joh」で始まる人のみが存在します。

次に、私のコンボボックスは「編集可能」ではないですが、どうすればそれを書くことができますか?現在は「ロックされています」...

私の問題は何ですか、それを解決する方法を理解していただければ幸いです。

答えて

1

WPFについてのすばらしい点の1つは、バインディングが可能なことです。具体的には、コード内のプロパティをUIのコントロールにバインドします。

のC#:

private List<Person> myList = new List<Person>(); 
public List<Person> MyList 
{ 
    get { return myList; } 
    set { myList = value; } 
} 

WPF:

<ComboBox Name="cboObjects" ItemsSource="{Binding MyList}"/> 

あなたが設定されますので、私はあなたが、あなたのコンボボックスに以下のようなものを持っているものは何でもオブジェクトのリストを結合するフィルタコンボボックスを持っていますコンボボックスをリストにバインドするだから、今はそれをフィルタリングする必要があります。次に、私はKeyBownイベントを使用してComboboxが入力されるたびに起動します。そのイベント中にユーザーのテキストをキャプチャし、リスト内のものと一致するものを見つけようとすると、見つかったものと同じリストプロパティが設定されます..

private void cboObjects_KeyDown(object sender, KeyEventArgs e) 
{ 
    string temp = ((ComboBox)sender).Text; 

    var newList = MyList.Where(x => x.Name.Contains(temp)); 

    MyList = newList.ToList(); 
} 

あなたの人物のリストがフィルタされました!このようにすることにはいくつかの問題がありますが、元のリストはもうなくなりました。もう1つのことは、このアプローチに進むと、あなたのUIが更新されない限り更新されないということです。したがって、INotifyPropertyChangedインタフェースを使用してください。プロパティを更新すると、いつでもイベントを発生させ、UIに値を再度取得するように指示します。

最後に、あなたのコンボボックスは編集不可能なので、IsReadOnly = false、IsEditable = trueに設定してみてください!

2

これは実際に組み込まれています!

あなたの操作は、ComboBoxコントロールで次のプロパティを設定することです。

<ComboBox ItemsSource="{Binding PersonList}" 
      IsTextSearchEnabled="True" 
      TextSearch.TextPath="Name"/> 

この例では、タイプPersonNameの性質を持っている、あなたがタイプPersonPersonListを前提としています。

TextSearch.TextPathは、検索対象のプロパティ(ItemsSourceコレクション内のアイテムのプロパティに基づいて)に設定する必要があります。

詳細情報はhttps://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.combobox.istextsearchenabled

関連する問題