You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:45:29