C# WPF可观察的收集&;集合视图源对筛选项应用排序

C# WPF可观察的收集&;集合视图源对筛选项应用排序,c#,wpf,datagrid,observablecollection,collectionviewsource,C#,Wpf,Datagrid,Observablecollection,Collectionviewsource,WPF对可观察到的集合进行过滤和排序 我有什么? 我有一个带有Datagrid的usercontrol和一个用于搜索Datagrid的文本框。 在我的viewmodel中,我有一个名为EmployeeCollection的ObservableCollection,它绑定到datagrid。让我们来看看以下是员工集合的内容 EmployeeName电子邮件id Emp1xyz1@abc.com 电磁脉冲xyz@abc.com 环境管理计划2xyz2@abc.com ABCabc@abc.com D

WPF对可观察到的集合进行过滤和排序

我有什么?

我有一个带有Datagrid的usercontrol和一个用于搜索Datagrid的文本框。 在我的viewmodel中,我有一个名为EmployeeCollection的ObservableCollection,它绑定到datagrid。让我们来看看以下是员工集合的内容

EmployeeName电子邮件id

Emp1xyz1@abc.com

电磁脉冲xyz@abc.com

环境管理计划2xyz2@abc.com

ABCabc@abc.com

DEFdef@abc.com

此集合绑定到datagrid,所有内容都正确显示。在视图模型中,我在collections默认视图中添加了以下过滤器,用于使用textbox中提供的输入搜索集合。显示精确匹配项以及以给定搜索文本开头的其他条目

CollectionViewSource.GetDefaultView(EmployeeCollection).Filter =
                        x => (((EmployeeViewModel)x).Name.Equals(SearchText, StringComparison.CurrentCultureIgnoreCase) || ((EmployeeViewModel)x).Name.ToLower().StartsWith(SearchText.ToLower()));
我期待什么?

现在,我在搜索文本框中键入“Emp”,然后单击搜索结果。 我期望的结果是首先显示精确匹配,然后显示部分匹配(从数据开始),如下所示

电磁脉冲xyz@abc.com

Emp1xyz1@abc.com

环境管理计划2xyz2@abc.com

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

Emp1xyz1@abc.com

电磁脉冲xyz@abc.com

环境管理计划2xyz2@abc.com


现在,如何先使用精确匹配,然后再使用部分匹配来实现排序?

您可以使用CustomSort和过滤器对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();

这只会在心理上正确排序。我需要的是先按精确匹配排序,然后按部分匹配排序。有可能实现这样的排序吗?