2

我是一个相当新手的程序员,正在制作一个 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 实现是否还有另一个警告?有没有我忘记设置的属性?这样做的正确方法是什么?

4

1 回答 1

1

我找到了一个解决方案,虽然我不知道它是否是理想的解决方案。因为 LINQ 查询的结果将项目放在Group其匿名类型的属性中,所以CollectionViewSource需要知道这一点。因此,通过添加ItemsPath="Group"到定义 的 XAML CollectionViewSource,它现在同时显示组标题和包含的项目。

于 2013-07-09T17:24:58.040 回答