2012-06-02 30 views
1

我想过滤WPF DataGrid和我做,在这种方式,我用datagridcolumnsheader,把一个文本框的标题,并用它们过滤每一列:如何更新wpf数据网格上的过滤器?

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过滤列表,然后按名称过滤='a',它只是按名称过滤列表='a'!

回答

1

若要应用多个过滤器绑定到WPF DataGrid中,你应该实例化一个CollectionViewSource对象视图和集合之间的代理集合(这也将与其他集控工作)。这样做将允许您将多个过滤器事件处理程序订阅到它的过滤器事件。过滤器按其订购的顺序应用,并可通过取消订阅来删除它们。

如果您在代码隐藏或ViewModel中使用了CollectionViewSource.GetDefaultView()静态方法,将返回一个仅支持具有Filter属性的单个过滤器的ICollectionView实例。

你可以在这里找到一个源代码示例http://www.codeproject.com/Articles/442498/Multi-filtered-WPF-DataGrid-with-MVVM