小工具知识网

当前位置: 首页 > 行业知识 > WPF 【十月的寒流】学习笔记(3):DataGrid分页

行业知识

WPF 【十月的寒流】学习笔记(3):DataGrid分页

2026-10-19 08:03:17 来源:互联网转载

文章目录

  • 前言
  • 相关链接
  • 代码仓库
  • 项目配置(省略)
    • 项目初始配置
      • xaml
      • viewModel
      • Filter过滤
        • 详细代码
        • 展示结果
        • 问题
        • Linq过滤
          • CollectionData
          • xaml
          • viewModel
          • sql,这里用到数据库,就不展开了
          • ���结

            前言

            我们这次详细了解一下列表通知的底层是怎么实现的

            相关链接

            十月的寒流

            WPF 中如何制作 DataGrid 的分页功能

            代码仓库

            我为了方便展示源代码,我将代码提交到了代码仓库里面

            B站【十月的寒流】对应课程的代码 Github仓库

            项目配置(省略)

            想要看的话看我前面的文章就可以了

            项目初始配置

            和我之前的代码差不多,详细的就看我的源码好了,我会用TabItem来简单说明的。这就是初始配置的代码了

            xaml

                                                                                

            viewModel

            namespace DataGrid_Pagination.ViewModels{    public partial class Demo1ViewModel : ObservableObject    {        public Demo1View Demo1View { get; set; }        [ObservableProperty]        private CollectionData collectionData = new CollectionData();        public Demo1ViewModel()        {            CollectionData = new CollectionData() {                Data = new Student().FakeMany(10)            };            CollectionData.Init();            CollectionData.CollectionView.Refresh();        }    }}

            Filter过滤

            详细代码

                                                                                
            namespace DataGrid_Pagination.ViewModels{    public partial class Demo2ViewModel : ObservableObject    {        public Demo2View View { get; set; }        [ObservableProperty]        private CollectionData collectionData = new CollectionData();        private int pageIndex = 1;        public int PageIndex        {            get => pageIndex;            set {                SetProperty(ref pageIndex, value);                CollectionData.CollectionView.Refresh();            }        }        public readonly int PageSize = 10;        [ObservableProperty]        private int pageCount = 1;        public Demo2ViewModel()        {            CollectionData = new CollectionData()            {                Data = new Student().FakeMany(150)            };            CollectionData.Binding();            CollectionData.CollectionView.CollectionChanged += (s, e) =>            {                var count = CollectionData.Data.ToList().Count;                PageCount = (int)Math.Ceiling((decimal)(count / PageSize));            };            CollectionData.CollectionView.Filter = (item) =>            {                if (!(item is Student))                {                    throw new Exception("属性类型不为Student");                }                var index = CollectionData.Data.ToList().IndexOf((Student)item);                return PageIndex == index / PageSize + 1;            };            CollectionData.CollectionView.Refresh();        }    }}

            展示结果

            问题

            小数据量没问题,但是大数据会出问题。因为主要的计算是indexOf和每个项的Filter。o(n)*o(n)=o(n^2),复杂度太高了。

            Linq过滤

            Linq过滤就是我们每次都更新CollectionView绑定的对象,触发更新

            CollectionData

                public partial class CollectionData:ObservableObject where T : class    {        [ObservableProperty]        private IEnumerable data = new List();        public ICollectionView CollectionView { get; set; }        public CollectionData() { }                public void Binding()        {            CollectionView = CollectionViewSource.GetDefaultView(Data);        }    }

            xaml

                                                            

            viewModel

            namespace DataGrid_Pagination.ViewModels{    public partial class Demo3ViewModel : ObservableObject    {        public Demo3View View { get; set; }        [ObservableProperty]        private CollectionData collectionData = new CollectionData();        private int pageIndex = 1;        public int PageIndex        {            get => pageIndex;            set            {                SetProperty(ref pageIndex, value);                CollectionData.CollectionView.Refresh();            }        }        public readonly int PageSize = 10;        [ObservableProperty]        private int pageCount = 1;        public readonly List Students = new Student().FakeMany(150).ToList();        public Demo3ViewModel()        {            CollectionData = new CollectionData()            {                Data = Students.Take(PageSize),            };            CollectionData.Binding();            CollectionData.CollectionView.CollectionChanged += (s, e) =>            {                var count = Students.Count;                PageCount = (int)Math.Ceiling((decimal)(count / PageSize));                CollectionData.Data = Students.Skip((PageIndex - 1) * PageSize).Take(PageSize);            };        }    }}

            sql,这里用到数据库,就不展开了

            总结

            分页是我们最常用的功能,这次简单实现了分页的效果。HandyControl没有提供主动的分页,需要我们组合一下。详细代码可以看我的Github仓库。三种过滤我都写了。

上一篇:饥荒怎么搭建独立服务器?

下一篇:远程主机服务器配置