我是一个相当新手的程序员,正在制作一个 Windows 应用商店应用程序。我有一个对象,其中包含一个ObservableCollection(Of T)我想分组以显示在ListView. 使用 LINQ 返回一组分组项似乎是最好和最简单的选择。我能找到的每篇文档都说 Group By 返回IEnumerable(Of IGrouping(Of TKey, TItem))并且您设置CollectionViewSource.IsSourceGrouped为 True,绑定到 CVS,它应该都能完美运行。正确的?
没那么多。
我有一个包含
Public Property Items As ObservableCollection(Of Item)
Public ReadOnly Property GroupedItems As IEnumerable
Get
' Return grouped items
End Get
End Property
在页面的 XAML 中, whereGroupedItems被设置为Page's DataContextin code-behind:
<Page.Resources>
<CollectionViewSource x:Name="GroupedItems" Source="{Binding}" IsSourceGrouped="True" />
</Page.Resources>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}">
<ListView.GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!-- Template -->
</DataTemplate>
</GroupStyle.HeaderTemplate>
</ListView.GroupStyle>
<ListView.ItemTemplate>
<DataTemplate>
<!-- Template -->
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
现在,如果我直接将 绑定ListView到,则会按预期呈现所有项目,紧随. 但是,当它绑定到应该分组时,会根据 呈现组,但不会呈现组内的任何项目。ObservableCollection(Of Item)ListViewItemTemplateCollectionViewSourceListViewHeaderTemplate
我检查了 LINQ 逻辑的结果:
Dim x = From i As Item In Items
Group i By Key = i.SubItem Into Group
并且x有一个Key属性和一个Group属性,虽然它是某种 IEnumerable(Of anonymous) 类型而不是IEnumerable(Of IGrouping(Of TKey, TItem)).
那么我在这里做错了什么?我缺少的 LINQ 的 VB.NET 实现是否还有另一个警告?有没有我忘记设置的属性?这样做的正确方法是什么?