【发布时间】:2009-04-20 16:38:14
【问题描述】:
大多数 WPF 数据网格控件都具有过滤显示数据的内置功能。我有兴趣使用该功能,但与数据网格的使用断开连接。
我希望找到一个返回Expression<Func<T, bool>> 的用户控件,我可以在LINQ 查询中使用它。有人知道这样的用户控件吗?
【问题讨论】:
标签: c# wpf linq user-controls
大多数 WPF 数据网格控件都具有过滤显示数据的内置功能。我有兴趣使用该功能,但与数据网格的使用断开连接。
我希望找到一个返回Expression<Func<T, bool>> 的用户控件,我可以在LINQ 查询中使用它。有人知道这样的用户控件吗?
【问题讨论】:
标签: c# wpf linq user-controls
在 WPF 中,内置控件的过滤是使用 CollectionView 执行的。然后将此CollectionView 分配为集合控件的ItemsSource(任何从ItemsControl 派生的东西)。
从 .NET 3.5 SP1 开始,CollectionView 类的过滤器属性采用 Predicate<object> 类型的委托。 Predicate<object> 似乎与Func<object, bool> 基本相同,但两者并不直接兼容。您应该能够轻松创建 Func<object, bool> 委托来包装 Predicate<object> 委托。
public static Func<object, bool> GetFuncFromPred(Predicate<object> pred)
{
return (obj => pred.Invoke(obj));
}
您可以在CollectionView 中的过滤器上调用它,然后在 LINQ 查询中使用它们。
例子:
List<object> list = GetList();
CollectionView colView = new CollectionView(list);
ListBox lb = GetListBox();
lb.ItemsSource = colView;
colView.Filter = GetFilter();
var filteredItems = list.Where(GetFuncFromPred(colView.Filter));
【讨论】:
我不知道。我们必须自己建造。
我们使用了 CollectionViewSource 并添加了默认过滤器以及将默认过滤器替换为自定义过滤器的功能。
【讨论】:
这是一个通用的、动态的、完整的 XAML 声明性项控件过滤器用户控件。它可以过滤数据网格、列表框、组合框等...
该组件使用预编译的链接表达式来检索和比较对象值,因此它提供了很好的性能。
希望这会有所帮助!
【讨论】: