我搜索示例或示例以通过文本框过滤WPF DataGrid列元素。
与this类似的东西(给定的示例使用 WPFToolkit ......显然已被Microsoft抛弃......)
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; }
}
答案 0 :(得分:25)
您可以通过将DataGrid绑定到支持过滤的ICollectionView
来过滤DataGrid中的Items。
.NET 4的详细信息here。对于.NET 4.5,该过程是相同的,但似乎文档已丢失。在“分组,排序和过滤”标题下有一点提及here。
编辑:在最初编写时,微软没有放弃WPF工具包。以前作为其一部分的控件现在在框架中,工具包还活着并且运行良好here
答案 1 :(得分:6)
我在各个网站上看到过很多关于这件事的事情......
使用数据表作为源过滤后者是一个数据网格,这在下面的代码中非常常见:
DataTable dt = new DataTable("Table1");
//fill your datatable...
//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";
答案 2 :(得分:3)
有几种解决方案,但在我看来,最好的解决方案是仅使用DataGrid
样式而没有发明新的继承DataGird
类型的解决方案。以下是我发现的最好的:
答案 3 :(得分: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
中