WPF Observable collection& Collection View Source对过滤的项目应用排序

时间:2014-05-22 09:08:37

标签: c# wpf datagrid observablecollection collectionviewsource

对Observable Collection进行WPF过滤和排序

我有什么?

我有一个带有Datagrid的usercontrol和一个用于搜索datagrid的文本框。 在我的viewmodel中,我有一个名为EmployeeCollection的ObservableCollection,它绑定到datagrid。让我们考虑以下是Employee Collection的内容

EmployeeName电子邮件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

现在如何首先使用完全匹配然后部分匹配来实现排序?

1 个答案:

答案 0 :(得分:2)

您可以使用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();