none
ListBoxのDataTemplate内でAutoCompleteBoxのItemFilter設定 RRS feed

  • 質問

  • ListBoxのDataTemplate内のことで質問です。このListBoxは、ListBoxと言っても、ItemsSourceはObservableCollectionにTwoWayでバインドしていて、入力に使用しています。

    WPF toolkitの、AutoCompleteBoxというものがあります。普通にWindowやUserControlの中で使う分には、(これが正して方法かわからないのですが)WindowやUserControlのコードビハインドで

    this.autoCompleteBox1.ItemFilter += (キー入力値と変換候補を比較してtrue/falseを返すメソッドないしラムダ式)
    

    としてやれば使えるのですが、このAutoCompleteBoxをDataTemplateの中で使うことはできるのでしょうか? つまり、上の一行と同じことを、DataTemplateで作られるそれぞれのListBoxItem内のAutoCompleteBoxに設定する方法はあるのでしょうか?

    そもそも、コードビハインドを使わずにデータバインドなどでフィルタに使うラムダ式やメソッドが指定できたらその方がよいのかも知れませんが。(実際、変換候補のItemsSourceや、確定した結果のTextは、バインディングだけでできていますし、フィルタ処理だけコードビハインドが必要なのもこれで正しいのかよくわかりません)

    2012年1月15日 10:59

回答

  • そもそも、コードビハインドを使わずにデータバインドなどでフィルタに使うラムダ式やメソッドが指定できたらその方がよいのかも知れませんが。(実際、変換候補のItemsSourceや、確定した結果のTextは、バインディングだけでできていますし、フィルタ処理だけコードビハインドが必要なのもこれで正しいのかよくわかりません)

    試していませんが、ItemFilterはAutoCompleteFilterPredicate型を受け取るようなので、それを返すプロパティを作成し、バインドしてしまえば良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク minami259 2012年1月16日 9:26
    2012年1月16日 2:53
    モデレータ
  • DataTemplateでのバインドの仕方が良くないのではないでしょうか? ListBoxのItemのDataContextはItemsSourceに指定したObservableCollectionのそれぞれになります。WindowやUserControlのDataContextとは異なることに注意して下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク minami259 2012年1月16日 9:26
    2012年1月16日 6:34
    モデレータ

すべての返信

  • そもそも、コードビハインドを使わずにデータバインドなどでフィルタに使うラムダ式やメソッドが指定できたらその方がよいのかも知れませんが。(実際、変換候補のItemsSourceや、確定した結果のTextは、バインディングだけでできていますし、フィルタ処理だけコードビハインドが必要なのもこれで正しいのかよくわかりません)

    試していませんが、ItemFilterはAutoCompleteFilterPredicate型を受け取るようなので、それを返すプロパティを作成し、バインドしてしまえば良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク minami259 2012年1月16日 9:26
    2012年1月16日 2:53
    モデレータ
  • 回答ありがとうございます。

    試してみたところ、WindowやUserControlに直接AutoCompleteBoxを置いた場合は、AutoCompleteFilterPredicate型としてプロパティを定義して、そこでラムダ式を公開してやれば、バインドうまくフィルタ処理できることを確認しました。

    しかし、その全く同じものを、ListBoxのDataTemplateの中に入れると、やはり、全く動作しなくなってしまいました(一切の候補が表示されず、単なるテキストボックスになってしまう)。この方法でも駄目なようです。

    何か方法はないでしょうか…

     

    2012年1月16日 5:42
  • DataTemplateでのバインドの仕方が良くないのではないでしょうか? ListBoxのItemのDataContextはItemsSourceに指定したObservableCollectionのそれぞれになります。WindowやUserControlのDataContextとは異なることに注意して下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク minami259 2012年1月16日 9:26
    2012年1月16日 6:34
    モデレータ
  • お恥ずかしい、ご指摘通りのケアレスミスが原因でした。

    ViewModelの方を見に行くようにバインドをきちんと設定したところ、無事にフィルタが動作するようになりました。

    結果、コードビハインドは不要になって、全てデータバインドだけで処理できるようになりました。

    ありがとうございました。

    2012年1月16日 9:25