2010-11-12 91 views
24

我搜索一个示例或示例来筛选WPF DataGrid列元素文本框。WPF DataGrid筛选器

alt text

类似的东西来this(给出的示例使用WPFToolkit ...由微软显然放弃了...)

编辑

代码更新

XAML

<Canvas> 
    <DataGrid Height="200" Name="dataGrid1" Width="200" Canvas.Top="23" /> 
    <TextBox Name="textBox1" Width="120" /> 
</Canvas> 

CS:

public partial class MainWindow : Window 
{ 
    private List<Personne> persons; 
    ICollectionView cvPersonnes; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     persons = new List<Personne>(); 

     persons.Add(new Personne() { Id = 1, Nom = "Jean-Michel", Prenom = "BADANHAR" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Gerard", Prenom = "DEPARDIEU" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Garfild", Prenom = "THECAT" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Jean-Paul", Prenom = "BELMONDO" }); 

     cvPersonnes = CollectionViewSource.GetDefaultView(persons); 

     if (cvPersonnes != null) 
     { 
      dataGrid1.AutoGenerateColumns = true; 
      dataGrid1.ItemsSource = cvPersonnes; 
      cvPersonnes.Filter = TextFilter; 
     } 
    } 

    public bool TextFilter(object o) 
    { 
     Personne p = (o as Personne); 
     if (p == null) 
      return false; 

     if (p.Nom.Contains(textBox1.Text)) 
      return true; 
     else 
      return false; 
    } 

} 

public class Personne 
{ 
    public int Id { get; set; } 
    public string Nom { get; set; } 
    public string Prenom { get; set; } 
} 

回答

23

可以通过它结合到支持滤波的ICollectionView过滤在数据网格中的项目。

详细信息here对于.NET 4.该过程对于.NET 4.5是相同的,但似乎文档已丢失。在“分组,排序和筛选”标题下有一小段提及here

编辑:在最初编写时,WPF工具包并未被微软放弃。过去是其中的一部分的控件现在在框架中,并且工具包还活着并且表现良好here

+0

你能评论我的代码编辑吗?过滤OnTextboxTextChange如何工作? – serhio 2010-11-16 20:43:08

+2

@vlad看起来你很快就说它不会被放弃。 – MgSam 2013-03-13 14:09:04

+0

被遗弃可能是错误的术语 - 该工具包已集成到.NET 4.0+中。'Relocated'可能是一个更好的词... – Doug 2014-03-12 17:58:59

0

我写了自己的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。他们可以适应在网格外工作,例如,在UserControl中也是如此,例如在UserControl中

+0

你能看到我的代码更新吗?当用户在文本框中输入时如何过滤? – serhio 2010-11-16 20:39:11

6

我在这件事情的各种网站无事生非吗...

要过滤后者使用数据表作为源,这是很常见的使下面的代码数据网格:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

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