我想过滤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这样的列,但是当我想在名称等其他列上进行过滤时,它只是按名称过滤列表并且不保留过去的过滤器,例如,如果我按ID过滤列表= 2,然后通过name ='a'过滤它,它只是按名称过滤列表='a'!
答案 0 :(得分:1)
要将多个过滤器应用于绑定到WPF DataGrid的集合,您应该将CollectionViewSource对象实例化为视图和集合之间的代理(这也适用于其他集合控件)。这样做将允许您为其Filter事件订阅多个过滤器事件处理程序。过滤器按订阅顺序应用,可以通过取消订阅来删除。
如果在代码隐藏或ViewModel中使用了CollectionViewSource.GetDefaultView()静态方法,则会返回ICollectionView的实例,该实例仅支持具有Filter属性的单个过滤器。
您可以在此处找到包含源代码的示例http://www.codeproject.com/Articles/442498/Multi-filtered-WPF-DataGrid-with-MVVM