如何使用带有 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 中创建批处理文件