web-dev-qa-db-ja.com

WPFのComboBoxのオートコンプリート(テキストの最初の部分だけでなく)

WPFにComboBoxがありますが、これをかなりいじりました(カスタムテンプレートとカスタムアイテムテンプレートがあります)。 ComboBoxに入力するときにフィルタリングが行われることを除いて、ほぼ希望どおりに機能するようになりましたが、入力したものがアイテムの名前を開始すると仮定してのみフィルタリングしますComboBox。

たとえば、ComboBoxに「Windows Media Player」というアイテムがある場合、「Windows Media ...」と入力し始めたときにのみ検出され、「Media Play ...」と入力し始めても検出されません。 。これを回避する方法はありますか? StartsWith()を使用するのではなく、文字列全体を検索するようにプロパティを設定できますか?

そうでない場合、自分でこれを行うための最善の方法は何でしょうか?元のコントロールを取り、基本的にStartsWith()の呼び出しをContains()の呼び出しに変更する方法はありますか、それとももっと低レベルにする必要がありますか?

29
robintw

CodeProjectの次の記事を参照してください。 再利用可能なWPFオートコンプリートテキストボックス

8
Aviad P.

コンボボックスはオートコンプリートをサポートするようになりました。コンボボックスのxamlで

IsEditable="True"
38
rreeves

私の知る限り、設定を変更するだけで標準のComboBoxを強制的にこのように動作させる方法はありません。そのため、独自のコンボボックスデリバティブを実装するか、既製のサードパーティコントロールを検索する必要があります(それらはたくさんあると思います)。

4

ComboBoxのTextInputイベントまたはPreviewTextInputイベントの処理、テキスト検索の実行、最適なアイテムの選択、および「e.Handled = true」の設定を試すことができます。ちょっとした考え。お役に立てれば!

編集:

これは単一の文字に対して機能します(つまり、「j」という文字を入力すると、「j」または「J」を含む最初の項目が選択されます)が、これをコントロールで行う方法があると確信しています。楽しい!

private void MyComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e) {
    foreach (ComboBoxItem i in MyComboBox.Items) {
        if (i.Content.ToString().ToUpper().Contains(e.Text.ToUpper())) {
            MyComboBox.SelectedItem = i;
            break;
        }
    }
    e.Handled = true;
}
4
Mark Carpenter

WPFコンボボックスはオートコンプリートをサポートしていません

アイテムにフィルターを適用することにより、間接的にこれを行うことができるサンプルを次に示します。

http://social.msdn.Microsoft.com/Forums/en-US/wpf/thread/cec1b222-2849-4a54-bcf2-03041efcf304/ を参照してください

2
amazedsaint