对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
现在如何首先使用完全匹配然后部分匹配来实现排序?
答案 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();