【问题标题】:WPF Observable collection & Collection View Source applying sort on filtered itemsWPF Observable 集合和集合视图源对过滤的项目应用排序
【发布时间】:2014-07-11 05:28:30
【问题描述】:

可观察集合上的 WPF 过滤和排序

我有什么?

我有一个带有数据网格的用户控件和一个用于搜索数据网格的文本框。 在我的视图模型中,我有一个名为 EmployeeCollection 的 ObservableCollection,它绑定到数据网格。让我们考虑以下是Employee Collection的内容

员工姓名电子邮件 ID

Emp1 xyz1@abc.com

Emp xyz@abc.com

Emp 2 xyz2@abc.com

ABC abc@abc.com

DEF def@abc.com

此集合绑定到数据网格,并且所有内容都正确显示。在视图模型中,我将以下过滤器添加到集合默认视图中,以便使用文本框中提供的输入搜索集合。显示完全匹配以及以给定搜索文本开头的其他条目。

CollectionViewSource.GetDefaultView(EmployeeCollection).Filter =
                        x => (((EmployeeViewModel)x).Name.Equals(SearchText, StringComparison.CurrentCultureIgnoreCase) || ((EmployeeViewModel)x).Name.ToLower().StartsWith(SearchText.ToLower()));

我的期望是什么?

现在,我在搜索文本框中输入“Emp”并单击搜索结果。 我期望的结果是先显示完全匹配,然后显示部分匹配(以数据开头),如下所示。

Emp xyz@abc.com

Emp1 xyz1@abc.com

Emp 2 xyz2@abc.com

但是我没有按照预期的顺序得到它。我按照数据存储在 EmployeeCollection 中的顺序获得结果。

Emp1 xyz1@abc.com

Emp xyz@abc.com

Emp 2 xyz2@abc.com

现在如何实现先完全匹配再部分匹配的排序?

【问题讨论】:

    标签: c# wpf datagrid observablecollection collectionviewsource


    【解决方案1】:

    您可以使用 CustomSort 和 Filter 对 CollectionView 进行相应的排序

    public class EmployeeComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            return string.Compare((EmployeeViewModel)x.Name, (EmployeeViewModel)y.Name);
        }
    }
    
    
    
    
    var view = (ListCollectionView)CollectionViewSource.GetDefaultView(EmployeeCollection);
     view.CustomSort = new EmployeeComparer();
    

    【讨论】:

    • 这只会按字母顺序正确排序。我需要的是先按完全匹配然后部分匹配对其进行排序。有没有可能实现这样的排序?
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2012-12-21
    • 2020-03-21
    相关资源
    最近更新 更多