【问题标题】:Standalone WPF Filter Control独立的 WPF 过滤器控件
【发布时间】:2009-04-20 16:38:14
【问题描述】:

大多数 WPF 数据网格控件都具有过滤显示数据的内置功能。我有兴趣使用该功能,但与数据网格的使用断开连接。

我希望找到一个返回Expression<Func<T, bool>> 的用户控件,我可以在LINQ 查询中使用它。有人知道这样的用户控件吗?

【问题讨论】:

    标签: c# wpf linq user-controls


    【解决方案1】:

    在 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));
    

    【讨论】:

    • 嘿,谢谢,但我认为您的回答有点偏离轨道。我正在寻找一个 WPF 控件来提供表达式。
    • 您可能会找到某人构建的自定义,但没有内置的 WPF 控件可以执行此操作。对不起。我在解释如果你愿意,你可以自己做这件事。
    【解决方案2】:

    我不知道。我们必须自己建造。

    我们使用了 CollectionViewSource 并添加了默认过滤器以及将默认过滤器替换为自定义过滤器的功能。

    【讨论】:

    • 无赖。我想这可能是要走的路。您是否能够构建一个使用泛型和反射的控件,或者为每个类创建硬编码过滤器?
    • 我们使用 Predicat 类型的公共依赖属性,然后在 CollectionViewSource 对象上设置过滤器属性,根据需要调用刷新。
    【解决方案3】:

    您可能想尝试一下:http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/

    这是一个通用的、动态的、完整的 XAML 声明性项控件过滤器用户控件。它可以过滤数据网格、列表框、组合框等...

    该组件使用预编译的链接表达式来检索和比较对象值,因此它提供了很好的性能。

    希望这会有所帮助!

    【讨论】:

    • 此外,您不必编写任何过滤逻辑或 C# 代码,只需在 XAML 中声明您的 ItemsControl,将其绑定到任何对象的任何集合,声明(也在 XAML 中)集合孩子类型和您希望过滤器应用的属性,然后就可以了。它还支持“AND/OR”切换模式,“!”操作数,并且可以引用自定义字符串格式或转换器,以确保对象值的格式与在 UI 中的比较方式相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多