1

wpf datagridをフィルタリングしたいのですが、このようにして、datagridcolumnsheaderを使用し、ヘッダーにテキストボックスを配置して、各列をフィルタリングします。

  private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        textSearch = (sender as TextBox).Text;
        CollectionViewSource.Filter += new FilterEventHandler(FilterEvent); 
    }

 private void FilterEvent(object sender, FilterEventArgs e)
    {
        if (propertyName == null)
            return;
        var a = e.Item.GetType().GetProperty("Name");
        if (a != null)
        {
            if (textSearch != "")
            {
                var s = a.GetValue(e.Item, null);
                if (s != null)
                    e.Accepted = s.ToString().Contains(textSearch);
                else
                    e.Accepted = false;
            }
            else
                e.Accepted = true;
        }
    }

idのような列では正常に機能しますが、nameのような別の列でフィルターを作成する場合は、名前だけでリストをフィルターし、過去のフィルターを保持しません。たとえば、id=2でリストをフィルターする場合などです。次に、name ='a'でフィルタリングし、リストをname='a'でフィルタリングします。

4

1 に答える 1

1

WPF DataGridにバインドされたコレクションに複数のフィルターを適用するには、ビューとコレクションの間のプロキシとしてCollectionViewSourceオブジェクトをインスタンス化する必要があります(これは他のコレクションコントロールでも機能します)。そうすることで、複数のフィルターイベントハンドラーをそのフィルターイベントにサブスクライブできるようになります。フィルタは、サブスクライブされた順序で適用され、サブスクライブを解除することで削除できます。

codebehindまたはViewModelでCollectionViewSource.GetDefaultView()静的メソッドを使用した場合、これは、Filterプロパティを持つ単一のフィルターのみをサポートするICollectionViewのインスタンスを返します。

ここでソースコードの例を見つけることができますhttp://www.codeproject.com/Articles/442498/Multi-filtered-WPF-DataGrid-with-MVVM

于 2012-10-03T14:02:57.800 に答える