2

http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listboxにあるJoshSmithの例に基づいて、リストにテキストボックスフィルターを実装しています。基本的に、ビューのフィルターを、検索ボックス内のテキストをチェックするデリゲートに設定します。私は次のようにフィルターを接続します:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView.View, SearchTextBox);

後でObjectDataProviderを更新すると、フィルターが失われます。更新後、pickerView.Viewのハッシュコードが異なることに気付きました。データが更新されると、すべてのビューが再作成されますか?ObjectDataProvider.Refresh()を呼び出すたびに、フィルターを再度アタッチする必要があるということですか?ベビーシッターを必要としないこのフィルターをインストールするためのよりスマートな方法はありますか?

4

1 に答える 1

4

CollectionViewSource.Source が設定されると CollectionViewSource.View が置き換えられると言っているのは正しいです。

解決策は、 CollectionView.Filterプロパティの代わりにCollectionViewSource.Filterイベントを使用することです。ビューがなくなっても、これは残ります。

Josh Smith のTextSearchFilterクラスに最小限の変更を加えるだけで、これを行うことができます。

public class TextSearchFilter
{
    public TextSearchFilter( 
        CollectionViewSource filteredView, 
        TextBox textBox )
    {
        string filterText = "";

        filteredView.Filter += delegate( object obj, FilterEventArgs e )                
        {
            if( String.IsNullOrEmpty( filterText ) )
                e.Accepted = true;

            string str = e.Item as string;
            if( String.IsNullOrEmpty( str ) )
                e.Accepted = false;

            int index = str.IndexOf(
                filterText,
                0,
                StringComparison.InvariantCultureIgnoreCase );

            e.Accepted = index > -1;
        };          

        textBox.TextChanged += delegate
        {
            filterText = textBox.Text;
            filteredView.View.Refresh();
        };
    }
}

接続コードは次のようになります。

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
于 2008-12-23T00:24:49.707 に答える