Първоначално публикувах това като 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.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 (изисква подизбор на правилния елемент), след това по Counter.
Чудех се дали създаването на групи ще помогне, но не мога да разбера дали това ще осигури възможността за сортиране, която търся.
Разгледах възможността за преобразуване в ListCollectionView вместо CollectionViewSource, след което да използвам CustomSort, но не мога да разбера как бих могъл да внедря това и дали би предложил и възможността, която търся, като се има предвид, че основното ми сортиране е стойност в рамките на вложен списък.
Може ли някой да допринесе, за да ми помогне да постигна резултата си?
Бен