Как реализовать несколько уровней сортировки на CollectionViewSource - PullRequest
1 голос
/ 12 ноября 2011

Я первоначально отправил это как запрос LINQ - получил это, и затем понял, что у меня была проблема.Вы не можете использовать запросы LINQ для выбора / фильтрации и упорядочения элементов в CollectionViewSource (почему я не проверил это сначала, почему это невозможно?).

Итак, ясейчас пытаюсь разобраться, как отсортировать отфильтрованный CollectionViewSource.

Мой CollectionViewSource связан с ObservableCollection (Of MediaItems).MediaItems содержит дочерний / вложенный список (Of AdvertOptions).

Родительский ObservableCollection (Of MediaItems) - класс структурирован следующим образом:

MediaItems
 .ID (int)
 .Src (string)
 .Advert (bool)
 .AdOptions As List(Of AdvertOptions)
 .Counter (int)

AdvertOptions class consists of:
 .Age (int)
 .Gender (int)
 .Priority (int)

Я отфильтровываю любые MediaItems, которые не 'не соответствует следующим критериям:

MediaItems.Advert = true
AdOptions.Age = x (parameter within triggered function called to perform the filter/sort)
AdOptions.Gender = y (parameter within triggered function called to perform the filter/sort)

После того, как CollectionViewSource отфильтрован, мне нужно отсортировать элементы на основе двух порядков сортировки, чтобы можно было перемещаться по результирующим элементам CollectionViewSource в моем приложении с помощью методов навигации CollectionViewSource(MoveCurrentToX и т. Д.).

Порядок сортировки, который мне нужно применить:

  1. AdOptions.Priority (в порядке убывания)
  2. По счетчику (в порядке возрастания)

Способ фильтрации заключается в использовании следующих функций:

Public Shared Sub FilterByAdvertisement(ByVal Item As Object, ByVal e As FilterEventArgs)

    Dim MediaObjectItem As MediaObject = TryCast(e.Item, MediaObject)

    If Not MediaObjectItem.IsAdvertisingMedia = True Then

        e.Accepted = False

    End If

End Sub

Public Shared Sub FilterByAvertisementOption(ByVal Item As Object, ByVal e As FilterEventArgs)

    Dim MediaObjectItem As MediaObject = TryCast(e.Item, MediaObject)

    Dim Items = From m In MediaObjectItem.AdOptions Select m Where m.Age = Current.Age And m.Gender = Current.Gender
    If Items.Count = 0 Then

        e.Accepted = False

    End If

End Sub

Просто для справки, я добавляю фильтр следующим образом:

Public AdvertisingDataView As CollectionViewSource

AddHandler AppLocal.AdvertisingDataView.Filter, AddressOf FilterByAdvertisement
AddHandler AppLocal.AdvertisingDataView.Filter, AddressOf FilterByAdvertisementOption

Теперь мне нужно работатькак отсортировать отфильтрованные элементы.Проблема в том, что CollectionViewSource, похоже, имеет ограниченную поддержку сортировки.Я могу легко отсортировать счетчик, используя:

AdvertisingDataView.SortDescriptions.Add(New SortDescription("Counter", ListSortDirection.Ascending))

Но это моя вторичная сортировка - я хочу отсортировать сначала по AdOptions.Priority (требуется дополнительный выбор нужного элемента), а затем по счетчику.

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

Я рассмотрел возможность преобразования в ListCollectionView вместо CollectionViewSource,затем с помощью CustomSort, но я не могу понять, как я мог бы реализовать это, и если бы он также предлагал возможность, которую я ищу, учитывая, что моя основная сортировка - это значение во вложенном списке.

Может ли кто-нибудь внести свой вкладчтобы помочь мне достичь моего результата?

Бен

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Вы можете достичь нескольких уровней сортировки в представлении по умолчанию вашего CollectionViewSource.По сути, WPF автоматически генерирует 3 типа представлений, все из которых получены из базового класса CollectionView:

  • ListCollectionView -> Создан, когда коллекция реализует IList.
  • BindingListCollectionView -> Создан, когдаколлекция реализует IBindingList.
  • EnumerableCollectionView -> Создается, когда коллекция реализует только IEnumerable.

Вы всегда можете добавить несколько SortDescriptor в коллекцию SortCollection вашего представления по умолчанию, например, -

ListCollectionView lcv =
(ListCollectionView)CollectionViewSource.GetDefaultView(myCollection);
lcv.SortDescriptions.Add(new SortDescription(…));

Обратитесь к этим ссылкам для дальнейшей ссылки -

0 голосов
/ 02 апреля 2018

Я не знаю, как написать это в VB, но я могу показать вам на c #, как это сделано:

YourListView = CollectionViewSource.GetDefaultView(tempListView
.OrderBy(x => x.FirstSorting)
.ThenBy(y => y.SecondSorting));

Посмотрите, как сделать то же самое в VB, и вы исправите это.

У вас есть ссылка прямо здесь - http://linqsamples.com/linq-to-objects/ordering/ThenBy-lambda-csharp

Удачи!

...