WinUI3中IncrementalLoadingCollection返回页面加载全量数据的问题
问题分析
导航返回页面时加载全部数据的核心原因:
- 每次返回页面都会触发
Loaded事件,导致你重复创建新的IncrementalLoadingCollection实例。 - 新集合绑定到ListView后,ListView可能因恢复之前的视图状态(比如自动滚动到之前的位置),持续触发增量加载逻辑,直到拉取完所有数据。
解决方案
1. 复用增量加载集合实例
将IncrementalLoadingCollection声明为页面私有成员变量,仅在首次加载时初始化,避免每次返回都创建新集合。
2. 启用页面导航缓存
设置页面的NavigationCacheMode为Enabled,让页面实例被缓存,返回时不会重新创建,从而避免Loaded事件重复触发。
修改后的代码
Courses.cs(WinUI3页面)
using CommunityToolkit.WinUI; using Fees_DBASC.Data.Sources; using Fees_DBASC.Models.DataModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; namespace Fees_DBASC.Views.Pages { public sealed partial class Courses : Page { // 私有成员变量保存增量加载集合,实现复用 private IncrementalLoadingCollection<CourseIncrementalSource, Course> _courseCollection; public Courses() { this.InitializeComponent(); // 启用页面导航缓存,避免返回时重新创建页面实例 this.NavigationCacheMode = NavigationCacheMode.Enabled; this.Loaded += Courses_Loaded; } private void Courses_Loaded(object sender, RoutedEventArgs e) { // 仅在集合未初始化时创建并绑定到ListView if (_courseCollection == null) { _courseCollection = new IncrementalLoadingCollection<CourseIncrementalSource, Course>(25); CourseList.ItemsSource = _courseCollection; } } private void OpenContextMenu(object sender, RightTappedRoutedEventArgs e) { ListView listView = (ListView)sender; bool singleItemSelected = (listView.SelectedItems.Count == 1); Delete.IsEnabled = (listView.SelectedItems.Count > 0); Edit.IsEnabled = singleItemSelected; ContextMenu.ShowAt(listView, e.GetPosition(listView)); } } }
额外优化建议
- 可在
CourseIncrementalSource的GetPagedItemsAsync方法中添加日志,确认每次触发的pageIndex值,排查是否存在异常索引请求。 - 若无需保留页面滚动状态,可在页面加载时重置ListView滚动位置:
CourseList.ScrollIntoView(CourseList.Items[0], ScrollIntoViewAlignment.Leading);
内容的提问来源于stack exchange,提问作者Selastin
相关产品推荐
相关产品推荐

