Multiple CustomSort эквивалентно Multiple SortDescription - PullRequest
0 голосов
/ 06 мая 2020

У меня есть ListCollectionView, полученный из ViewModel в представлении:

var collectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(ViewModel.Items);

И группировка и сортировка по определенным столбцам:

// group
collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Index"));
// sort
collectionView.SortDescriptions.Add(new SortDescription("Index", ListSortDirection.Ascending));
collectionView.SortDescriptions.Add(new SortDescription("Key", ListSortDirection.Ascending));

Он работает, как ожидалось (первая группа отсортированы по индексу, а подпункты отсортированы по ключу в алфавитном порядке.

На данный момент я хочу использовать настраиваемую сортировку по ключевым словам с реализацией IComparer, и я пробовал использовать SortDescription с CustomSort, но CustomSort очищает SortDescription если используется. Таким образом, действует только CustomSort.

collectionView.CustomSort = new CustomItemKeyComparer(StringComparer.CurrentCulture);
collectionView.SortDescriptions.Add(new SortDescription("Index", ListSortDirection.Ascending));

Итак, как использовать CustomSort с сортировкой по нескольким столбцам в ListCollectionView?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

У вас есть два варианта.

  1. Ваш CustomItemKeyComparer класс должен содержать logi c для сортировки элементов по всем свойствам.

  2. Добавьте еще одно свойство в свой класс элемента данных, которое возвращает значение на основе пользовательского журнала сортировки c, а затем просто добавьте еще одно свойство SortDescription в представление коллекции.

Другими словами, вы не должны смешивать SortDescriptions и CustomSort. Одно или другое, но не то и другое одновременно.

0 голосов
/ 14 июля 2020

Просто чтобы расширить ответ, данный @ mm8 и первый предоставленный вариант.

Я буду переписывать некоторый код из этого блога, чтобы создать собственный IComparer, поддерживающий несколько столбцов / свойств: https://weblogs.asp.net/monikadyrda/wpf-listcollectionview-for-sorting-filtering-and-grouping

public class SortCreaturesByAgeAndFirstName : IComparer
{
    public int Compare( object x, object y )
    {
        if( x as CreatureModel == null && y as CreatureModel == null )
        {
            throw new ArgumentException( "SortCreatures can 
                                    only sort CreatureModel objects." );
        }
        if( ((CreatureModel) x).Age > ((CreatureModel) y).Age )
        {
            return 1;
        }
        else if( ((CreatureModel) x).Age < ((CreatureModel) y).Age )
        {
            return -1;
        }
        else
        {
            // If the Age of the creatures are equal then sort by another property
            return string.Compare(x.FirstName, y.FirstName);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...