wpf - 如何更新 wpf 数据网格上的过滤器?

标签 wpf mvvm wpfdatagrid collectionviewsource

我想过滤 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' 过滤列表!

最佳答案

要将多个过滤器应用于绑定(bind)到 WPF DataGrid 的集合,您应该实例化一个 CollectionViewSource 对象作为 View 和集合之间的代理(这也适用于其他集合控件)。这样做将允许您将多个过滤器事件处理程序订阅到它的过滤器事件。过滤器按照订阅的顺序应用,并且可以通过取消订阅来删除。

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

您可以在此处找到带有源代码的示例 http://www.codeproject.com/Articles/442498/Multi-filtered-WPF-DataGrid-with-MVVM

关于wpf - 如何更新 wpf 数据网格上的过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860285/

相关文章:

wpf - wpf中的条形码生成器

model-view-controller - 将客户端MVC/MVVM模式与MVC服务器端模式一起使用

wpf - Datagrid : Is there no Sorted event?

c# - 遍历数据网格 WPF 的行

WPF ListBox,如何隐藏边框并更改所选项目的背景颜色?

wpf - 当涉及紧凑型数据库时,ClickOnce 安装程序如何处理更新?

c# - 在WPF MVVM中,如何在运行时从文本框值调整图像大小?

c# - WPF MVVM 检索数据网格选定的行

c# - 验证 MVVM 中的空字段

c# - 如何基于绑定(bind)列表构建包含其他控件的 WPF 控件