如何使用带有 CollectionViewSource 的增量加载集合对 UWP 中的列表视图项进行分组?

Posted

技术标签:

【中文标题】如何使用带有 CollectionViewSource 的增量加载集合对 UWP 中的列表视图项进行分组?【英文标题】:How to use Incremental Loading Collection with CollectionViewSource to group list view items in UWP? 【发布时间】:2021-11-17 04:44:39 【问题描述】:

我跟进了IncrementalLoadingCollection 的这个例子,并创建了一个带有增量加载集合(无限滚动)的应用程序。

XAML:

<ListView x:Name="PeopleListView">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:Person">
            <TextBlock Text="x:Bind Name" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

C#:

public class Person

    public string Name  get; set; 


public class PeopleSource : IIncrementalSource<Person>

    private readonly List<Person> people;

    public PeopleSource()
    
        // Populate people
        ...
    
    public async Task<IEnumerable<Person>> GetPagedItemsAsync(int pageIndex, int pageSize)
    
        // Gets and returns items from the collection according to pageIndex and pageSize parameters
        ...
    
    

var collection = new IncrementalLoadingCollection<PeopleSource, Person>();
PeopleListView.ItemsSource = collection;

但现在我还需要对项目进行分组,例如,按名称的长度分组。 另外,使用CollectionViewSource 这个例子,我创建了一个我期望的例子:

XAML:

<Grid.Resources>
    <CollectionViewSource x:Name="groupInfoCVS" IsSourceGrouped="true" />
</Grid.Resources>
<ListView x:Name="PeopleListView" ItemsSource="Binding Source=StaticResource groupInfoCVS">
    ...
</ListView>

C#:

public string Name  get; set; 

// Populate people
...

var result =
from t in people
group t by t.Name.Length into g
orderby g.Key
select g;

groupInfoCVS.Source = result;

问题是我需要使用增量加载并对项目进行分组,我找不到将 IncrementalLoadingCollection 与 CollectionViewSource 一起使用的方法。 有谁知道如何做到这一点或可以提出解决方案? 感激不尽。

【问题讨论】:

【参考方案1】:

如何使用增量加载集合和 CollectionViewSource 对 UWP 中的列表视图项进行分组?

我不得不说,IncrementalLoadingCollection 不适用于CollectionViewSource。它们都需要直接设置为ListView的ItemsSource才能工作。因为他们需要检测listviewInteraction

因此,根据您的要求,我们建议收听 listview ViewChanged 并手动添加更多项目。

例如

private void PeopleListView_Loaded(object sender, RoutedEventArgs e)

    if (!(PeopleListView.ItemsPanelRoot is ItemsStackPanel itemsStackPanel)) return;
    var _itemsStackPanel = itemsStackPanel;
    var _scrollViewer = MyFindDataGridChildOfType<ScrollViewer>(PeopleListView);
    // This event handler loads more items when scrolling.
    _scrollViewer.ViewChanged += (o, eventArgs) =>
    
        if (eventArgs.IsIntermediate) return;
        double distanceFromBottom = itemsStackPanel.ActualHeight - _scrollViewer.VerticalOffset - _scrollViewer.ActualHeight;
        if (distanceFromBottom < 10) // 10 is an arbitrary number
        
            for (int i = 1; i <= 50; i++)
            
                var p = new Person  Name = "Person " + i ;
                _people.Add(p);
                var result =
                            from t in _people
                            group t by t.Name.Length into g
                            orderby g.Key
                            select g;

                groupInfoCVS.Source = result;
                PeopleListView.ItemsSource = groupInfoCVS.View;
            
        
    ;

【讨论】:

以上是关于如何使用带有 CollectionViewSource 的增量加载集合对 UWP 中的列表视图项进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地使用带有 express 的 graphql 和带有 mongoose 的 mongodb 来检索文档?

如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件

如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?

如何使用带有打字稿的“调试”模块

如何使用 Qt 发送带有图像附件的电子邮件?

如何使用python在sqlplus中插入带有'&'的值