WPF Observable collection & Collection View Source, применяющий сортировку к отфильтрованным элементам

Фильтрация и сортировка WPF в наблюдаемой коллекции

Что у меня есть?

У меня есть пользовательский элемент управления с сеткой данных и текстовым полем для поиска в сетке данных. В моей модели представления у меня есть ObservableCollection с именем EmployeeCollection, который привязан к сетке данных. Рассмотрим следующее содержимое коллекции сотрудников.

Идентификатор электронной почты EmployeeName

Emp1 [email protected]

Эмп [email protected]

Эмп 2 [email protected]

Азбука [email protected]

DEF [email protected]

Эта коллекция привязана к сетке данных, и все отображается правильно. И в модели представления я добавил следующий фильтр в представление коллекций по умолчанию для поиска коллекции с использованием ввода, предоставленного в текстовом поле. Чтобы отобразить точное совпадение, а также другие записи, начинающиеся с заданного текста поиска.

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

Чего я ожидаю?

Теперь в текстовом поле поиска я набираю «Emp» и нажимаю на результаты поиска. В результате я ожидаю сначала отобразить точное совпадение, а затем отобразить частичное совпадение (начинается с данных) следующим образом.

Эмп [email protected]

Emp1 [email protected]

Эмп 2 [email protected]

Однако я не получаю его в ожидаемом порядке. Я получаю результат в том порядке, в котором данные хранятся в EmployeeCollection.

Emp1 [email protected]

Эмп [email protected]

Эмп 2 [email protected]

Теперь, как мне добиться сортировки сначала с точным совпадением, а затем с частичным совпадением?


person Yuvaraj    schedule 22.05.2014    source источник


Ответы (1)


Вы можете использовать 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();
person Nitin    schedule 22.05.2014
comment
это будет сортировать по алфавиту только правильно. Мне нужно сначала отсортировать его по точному совпадению, а затем по частичному совпадению. Можно ли добиться такой сортировки? - person Yuvaraj; 23.05.2014