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

文章目录

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

前言

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

相关链接

十月的寒流

在这里插入图片描述

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

代码仓库

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

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

项目配置(省略)

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

项目初始配置

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

在这里插入图片描述

xaml

<UserControl x:Class="DataGrid_Pagination.Views.Demo1View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DataGrid_Pagination.Views"
             mc:Ignorable="d" 
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:viewModels="clr-namespace:DataGrid_Pagination.ViewModels"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.DataContext>
        <viewModels:Demo1ViewModel  x:Name="ViewModel"/>
    </UserControl.DataContext>
    <DockPanel>
        <hc:Pagination MaxPageCount="10"
                       DockPanel.Dock="Bottom"
                       Margin="4 7"
                       PageIndex="5"
                       IsJumpEnabled="True" />
        <DataGrid ItemsSource="{Binding CollectionData.Data}">
            
        </DataGrid>
        
    </DockPanel>
</UserControl>

viewModel

namespace DataGrid_Pagination.ViewModels
{
    public partial class Demo1ViewModel : ObservableObject
    {

        public Demo1View Demo1View { get; set; }

        [ObservableProperty]
        private CollectionData<Student> collectionData = new CollectionData<Student>();

        public Demo1ViewModel()
        {
            CollectionData = new CollectionData<Student>() {
                Data = new Student().FakeMany(10)
            };
            CollectionData.Init();
            CollectionData.CollectionView.Refresh();
        }
    }
}

Filter过滤

在这里插入图片描述

详细代码

<UserControl x:Class="DataGrid_Pagination.Views.Demo2View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DataGrid_Pagination.Views"
             mc:Ignorable="d" 
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:viewModels="clr-namespace:DataGrid_Pagination.ViewModels"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.DataContext>
        <viewModels:Demo2ViewModel  x:Name="ViewModel"/>
    </UserControl.DataContext>
    <DockPanel>
        <hc:Pagination MaxPageCount="{Binding PageCount}"
                       DockPanel.Dock="Bottom"
                       Margin="4 7"
                       PageIndex="{Binding PageIndex,Mode=TwoWay}"
                       IsJumpEnabled="True" />
        <DataGrid ItemsSource="{Binding CollectionData.Data}">
            
        </DataGrid>
        
    </DockPanel>
</UserControl>


namespace DataGrid_Pagination.ViewModels
{
    public partial class Demo2ViewModel : ObservableObject
    {

        public Demo2View View { get; set; }

        [ObservableProperty]
        private CollectionData<Student> collectionData = new CollectionData<Student>();



        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<Student>()
            {
                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<T>:ObservableObject where T : class
    {
        [ObservableProperty]
        private IEnumerable<T> data = new List<T>();

        public ICollectionView CollectionView { get; set; }
        public CollectionData() { }

        

        public void Binding()
        {
            CollectionView = CollectionViewSource.GetDefaultView(Data);
        }


    }

xaml

<UserControl x:Class="DataGrid_Pagination.Views.Demo3View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:DataGrid_Pagination.Views"
             mc:Ignorable="d"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:viewModels="clr-namespace:DataGrid_Pagination.ViewModels"
             d:DesignHeight="450"
             d:DesignWidth="800">
    <UserControl.DataContext>
        <viewModels:Demo3ViewModel  x:Name="ViewModel" />
    </UserControl.DataContext>
    <DockPanel>
        <hc:Pagination MaxPageCount="{Binding PageCount}"
                       DockPanel.Dock="Bottom"
                       Margin="4 7"
                       PageIndex="{Binding PageIndex,Mode=TwoWay}"
                       IsJumpEnabled="True" />
        <DataGrid ItemsSource="{Binding CollectionData.Data}">

        </DataGrid>

    </DockPanel>
</UserControl>

viewModel


namespace DataGrid_Pagination.ViewModels
{
    public partial class Demo3ViewModel : ObservableObject
    {
        public Demo3View View { get; set; }

        [ObservableProperty]
        private CollectionData<Student> collectionData = new CollectionData<Student>();

        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<Student> Students = new Student().FakeMany(150).ToList();


        public Demo3ViewModel()
        {
            CollectionData = new CollectionData<Student>()
            {
                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仓库。三种过滤我都写了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/413828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20下使用 torchviz可视化计算图

安装 torchviz&#xff1a; pip install torchviz示例代码&#xff1a;下面是一个简单的示例代码&#xff0c;展示如何使用 torchviz 可视化计算图&#xff1a; python import torch from torchviz import make_dot# 创建一个简单的模型 model torch.nn.Sequential(torch.nn…

k8s部署java微服务程序时,关于配置conusl acl token的方法总结

一、背景 java微服务程序使用consul作为服务注册中心&#xff0c;而consul集群本身的访问是需要acl token的&#xff0c;以增强服务调用的安全性。 本文试着总结下&#xff0c;有哪些方法可以配置consul acl token&#xff0c;便于你根据具体的情况选择。 个人认为&#xff…

蓝桥杯题练习:平地起高楼

题目要求 function convertToTree(regions, rootId "0") {// TODO: 在这里写入具体的实现逻辑// 将平铺的结构转化为树状结构&#xff0c;并将 rootId 下的所有子节点数组返回// 如果不存在 rootId 下的子节点&#xff0c;则返回一个空数组}module.exports convert…

from tensorflow.keras.layers import Dense,Flatten,Input报错无法引用

from tensorflow.keras.layers import Dense,Flatten,Input 打印一下路径&#xff1a; import tensorflow as tf import keras print(tf.__path__) print(keras.__path__) [E:\\开发工具\\pythonProject\\studyLL\\venv\\lib\\site-packages\\keras\\api\\_v2, E:\\开发工具\\…

jenkins+kubernetes+git+dockerhub构建devops云平台

Devops简介 k8s助力Devops在企业落地实践 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 什么是Devops&#xff1f; 敏捷开发 提高开发效率&…

《剑指Offer》--查缺补漏

C sizeof 赋值运算符函数 在C中可以用 struct 和 class 来定义类型。这两种类型有什么区别&#xff1f; 数组 面试题4&#xff1a;二维数组中的查找 暂留 字符串 C/C中每个字符串都以字符

在TMP中计算书名号《》高度的问题

1&#xff09;在TMP中计算书名号《》高度的问题 2&#xff09;FMOD设置中关于Virtual Channel Count&Real Channel Count的参数疑问 3&#xff09;Unity 2021.3.18f1 ParticleSystemTrailGeometryJob粒子拖尾系统崩溃 4&#xff09;XLua打包Lua文件粒度问题 这是第375篇UWA…

NR 2-STEP RA Absolute Timing Advance Command MAC CE的应用场景

3 GPP在 R2-2002413中将2-step RA引入&#xff0c;进而R16 38.321出现了 Absolute TAC MAC CE&#xff0c;在 NR Timing Advance(TA)_ntn rrc-CSDN博客 有提到这个MAC CE&#xff0c;当时以“absolute timing advance command MAC CE 在2-step RA的某个场景下使用”一笔带过&am…

前端架构: 脚手架命令行交互核心实现之inquirer和readline的应用教程

命令行交互核心实现 核心目标&#xff1a;实现命令行行交互&#xff0c;如List命令行的交互呢比命令行的渲难度要更大&#xff0c;因为它涉及的技术点会会更多它涉及以下技术点 键盘输入的一个监听 (这里通过 readline来实现)计算命令行窗口的尺寸清屏光标的移动输出流的静默 …

大数据集群管理软件 CDH、Ambari、DataSophon 对比

文章目录 引言工具介绍CDHAmbariDataSophon 对比分析 引言 大数据集群管理方式分为手工方式和工具方式&#xff0c;手工方式一般指的是手动维护平台各个组件&#xff0c;工具方式是靠大数据集群管理软件对集群进行管理维护。本文针对于常见的方法和工具进行比较&#xff0c;帮助…

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解&#xff1a;什么是机器学习扩展阅读&#xff1a;机器学习的流程 LangChain Introduction LLM的限制 大型语言模型&#xff0c;比如ChatGpt4&#xff0c;尽管已经非常强大&#xff0c;但是仍然存在一些限制&#xff1a; 知识更新&#xff…

SQL注入漏洞解析--less-7

我们先看一下第七关 页面显示use outfile意思是利用文件上传来做 outfile是将检索到的数据&#xff0c;保存到服务器的文件内&#xff1a; 格式&#xff1a;select * into outfile "文件地址" 示例&#xff1a; mysql> select * into outfile f:/mysql/test/one f…

在Golang中简化日志记录:提升性能和调试效率

最大化效率和有效故障排除&#xff1a;在Golang中简化日志记录 日志记录是软件开发的一个基本方面&#xff0c;有助于调试、监控和理解应用程序的流程。在Golang中&#xff0c;有效的日志记录实践可以显著提高性能并简化调试过程。本文探讨了优化Golang日志记录的技术&#xf…

51单片机晶振频率与定时中断产生pwn占空比

单片机中晶振频率为12MHZ的机器周期怎么算? 1、系统晶振频率是12M&#xff0c;则机器周期&#xff1d;12&#xff0f;12&#xff1d;1us&#xff1b; 2、定时1ms&#xff1d;1&#xff0a;1000&#xff1d;1000us&#xff1b; 3、工作在方式0下&#xff1a;最大计数值是2&a…

亚信安慧AntDB助力全链路实时化

实时数据平台&#xff0c;快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念&#xff0c;通过实时数据应用平台来装载庞大的信息量&#xff0c;进行实时分析处理&#xff0c;克服数据处理过程中的困难&#xff0c;是当下各企事业单位、互联网、金融&#xff0c…

Charles授权码生成器

若资金允许&#xff0c;请点击https://www.charlesproxy.com 购买正版 若资金允许&#xff0c;请点击https://www.charlesproxy.com 购买正版 若资金允许&#xff0c;请点击https://www.charlesproxy.com 购买正版 闲来无事&#xff0c;用GO语言写了个Charles授权码生成器。 使…

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

Rust调用同级目录中的rs文件和调用下级目录中的rs文件

一、Rust调用同级目录中的rs文件 Rust新建工程demo02&#xff0c;src文件夹下面新建test.rs文件&#xff0c;这样main.rs文件与它属于同级目录中。 关键点&#xff1a;导入test文件和test文件中的Ellipse模块 mod test;//导入test模块&#xff08;文件&#xff09; use test…

StarRocks实战——携程酒店实时数仓

目录 一、实时数仓 二、实时数仓架构介绍 2.1 Lambda架构 2.2 Kappa架构 三、携程酒店实时数仓架构 3.1 架构选型 3.2 实时计算引擎选型 3.3 OLAP选型 四、携程酒店实时订单 4.1 数据源 4.2 ETL数据处理 4.3 应用效果 4.4 总结 原文大佬的这篇实时数仓建设案例有借…