我最初将其发布为 LINQ 查询 - 让它工作,然后意识到我遇到了问题。您不能使用 LINQ 查询来选择/过滤和排序 CollectionViewSource 中的项目(为什么哦,为什么我不先检查这个,为什么哦,为什么这不可能?)。
所以,我现在正试图弄清楚如何对过滤后的 CollectionViewSource 进行排序。
我的 CollectionViewSource 绑定到 ObservableCollection(Of MediaItems)。MediaItems 包含一个子/嵌套列表(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)
我正在过滤掉任何不符合以下条件的 MediaItem:
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 导航方法(MoveCurrentToX 等)在我的应用程序中导航生成的 CollectionViewSource 项目。
我需要应用的排序顺序是:
- 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 似乎对排序的支持有限。我可以使用以下方法轻松对 Counter 进行排序:
AdvertisingDataView.SortDescriptions.Add(New SortDescription("Counter", ListSortDirection.Ascending))
但这是我的次要排序 - 我想先按 AdOptions.Priority 排序(需要子选择正确的项目),然后按计数器。
我想知道创建组是否会有所帮助,但无法确定这是否会提供我正在寻找的排序功能。
我已经研究了转换为 ListCollectionView 而不是 CollectionViewSource,然后使用 CustomSort 的可能性,但我不知道如何实现这一点,以及它是否还能提供我正在寻找的功能,因为我的主要排序是嵌套列表中的值。
任何人都可以帮助我实现我的成果吗?
本