Wpf 在文本框中筛选数据网格

Wpf 在文本框中筛选数据网格,wpf,datagrid,wpfdatagrid,Wpf,Datagrid,Wpfdatagrid,我搜索一个示例或示例,通过文本框过滤WPF DataGrid列元素 类似于(给定的示例使用WPFToolkit…显然被Microsoft放弃了…) XAML 政务司司长: 公共部分类主窗口:窗口 { 私人名单人员; ICollectionView cvPersonnes; 公共主窗口() { 初始化组件(); 人员=新列表(); 添加(newpersonne(){Id=1,Nom=“Jean-Michel”,Prenom=“BADANHAR”}); 添加(newpersonne(){Id=

我搜索一个示例或示例,通过文本框过滤WPF DataGrid列元素

类似于(给定的示例使用WPFToolkit…显然被Microsoft放弃了…)

XAML


政务司司长:

公共部分类主窗口:窗口
{
私人名单人员;
ICollectionView cvPersonnes;
公共主窗口()
{
初始化组件();
人员=新列表();
添加(newpersonne(){Id=1,Nom=“Jean-Michel”,Prenom=“BADANHAR”});
添加(newpersonne(){Id=1,Nom=“Gerard”,Prenom=“DEPARDIEU”});
添加(newpersonne(){Id=1,Nom=“Garfild”,Prenom=“THECAT”});
添加(newpersonne(){Id=1,Nom=“Jean-Paul”,Prenom=“BELMONDO”});
cvPersonnes=CollectionViewSource.GetDefaultView(个人);
如果(cvPersonnes!=null)
{
dataGrid1.AutoGenerateColumns=true;
dataGrid1.ItemsSource=cvPersonnes;
cvPersonnes.Filter=TextFilter;
}
}
公共布尔文本过滤器(对象o)
{
人员p=(o为人员);
if(p==null)
返回false;
if(p.Nom.Contains(textBox1.Text))
返回true;
其他的
返回false;
}
}
公职人员
{
公共int Id{get;set;}
公共字符串Nom{get;set;}
公共字符串Prenom{get;set;}
}

您可以通过将数据网格绑定到支持筛选的
ICollectionView
来筛选数据网格中的项

有关.NET4的详细信息。过程与.NET4.5相同,但文档似乎丢失了。在“分组、排序和筛选”标题下有一个小小的提及


编辑:在最初编写这篇文章时,WPF工具包并没有被微软抛弃。以前是它的一部分的控件现在已经在框架中了,工具箱还活着,而且做得很好

我已经编写了自己的FilterDataGrid控件,它比CodeProject或其他地方提供的控件灵活得多。我既不能在这里发布完整的代码,也不能发布它

但是:由于您的数据源很可能被包装到ICollectionView中,因此您可以执行以下操作:

    public void ApplyFilters()
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
        if (view != null)
        {
            view.Filter = FilterPredicate; 
        }
    }

    private bool FilterPredicate(object item)
    {
        var yourBoundItemOrRow = item as BoundItemType;

        return aFilterObject.Matches(yourBoundItemOrRow);
    }

基于此概念,您可以轻松实现任何过滤器逻辑。甚至是非常非常强大的过滤器。注意:在我自己的类中,这些方法都是从datagrid派生的。它们也可以适应网格之外的工作,例如在用户控件中有几种解决方案,但在我看来,最好的解决方案是只使用
DataGrid
样式而不发明新的继承
DataGrid
类型的解决方案。以下是我发现的最好的:

  • 选项1:我个人使用的:
  • 备选案文2:

我在不同的网站上看到了很多关于这件事的麻烦

使用datatable作为源来过滤datagrid,这在下面的代码中非常常见:

DataTable dt = new DataTable("Table1");

//fill your datatable...

//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";

你能看看我的代码更新吗。当用户在文本框中键入内容时,您如何进行过滤?您能否评论我的代码编辑?过滤OnTextboxTextChange是如何工作的?@vlad看起来你说得太早了,没有放弃它。放弃可能是一个错误的术语——该工具包集成到了.NET 4.0+“重新定位”可能是个更好的词…第一个链接断了。
    public void ApplyFilters()
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
        if (view != null)
        {
            view.Filter = FilterPredicate; 
        }
    }

    private bool FilterPredicate(object item)
    {
        var yourBoundItemOrRow = item as BoundItemType;

        return aFilterObject.Matches(yourBoundItemOrRow);
    }
DataTable dt = new DataTable("Table1");

//fill your datatable...

//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";