Я первоначально отправил это как запрос 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 и т. Д.).
Порядок сортировки, который мне нужно применить:
- AdOptions.Priority (в порядке убывания)
- По счетчику (в порядке возрастания)
Способ фильтрации заключается в использовании следующих функций:
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, но я не могу понять, как я мог бы реализовать это, и если бы он также предлагал возможность, которую я ищу, учитывая, что моя основная сортировка - это значение во вложенном списке.
Может ли кто-нибудь внести свой вкладчтобы помочь мне достичь моего результата?
Бен