支持分页的MVVM组件大家可以网上找,老周这个类只是没事写来娱乐一下的,主要是功能简单,轻量级,至少它满足了我的需求,也许还有未知的 bug 。

这个类支持对数据列表进行分页处理,原理是利用 Skip 和 Take 扩展方法,从源列表中取出某一段数据。在实例化的时候,需要提供一个 IEnumerable<T> 对象作为参数,本类会根据这个数据源来计算分页,使用参数T使其支持泛型。

        public PagabledCollection(IEnumerable<T> srcItems)
{
_containerItems = srcItems;
// 总项目数
_totalItems = _containerItems.Count();
// 计算总页数
ComputePages(); CurrentPage = ; //默认页
}

私有字段 _containerItems 主要用来引用源数据列表,_totalItems表示所有数据的总数,CurrentPage属性表示的是当前页的索引,一般来说,分页是从第1页开始的,即当前页的索引最小值为1,最大值是总页数。

ComputePages方法用来计算总页数,代码如下:

        private void ComputePages()
{
int p = TotalItems / PageSize;
if ((TotalItems % PageSize) > )
{
p++;
}
TotalPages = p;
……
}

把数据总数除以每页显示条数(PageSize)就能得到页数,但要注意一点,就是余数的问题。比如数据总数为10,每页显示3条数据,那么 10 / 3的结果为3,余数为1,这时候,总页数应该为4,而不是3。所以上面代码在除法运算后要检查一下,如果存在余数,就把总页数加上1。

CurrentPage 属性表示当前页索引,当该属性修改后,要根实际情况从源数据列表中取出一段数据,然后用 PagedItems 属性公开。

        public int CurrentPage
{
get { return _currentPage; }
set
{
if (_currentPage != value)
{
if (value < ) _currentPage = ;
else if (value > TotalPages) _currentPage = TotalPages;
else _currentPage = value;
// 筛选内容
SetPagedItemsCore();
CheckPaging();
OnPropertyChanged(nameof(CurrentPage));
}
}
}

上面说过,当前页索引的最小值为1,最大值为总页数,所以在set属性时要进行验证。SetPagedItemsCore

方法的功能是根据当前页索引,从源数据列表中筛选出一段数据。方法定义如下:

        private void SetPagedItemsCore()
{
var r = _containerItems.Skip((CurrentPage - ) * PageSize).Take(PageSize);
PagedItems = r;
}

从源数据列表中取数据的开始位置 = (当前页码 - 1) * 每页显示数,要提取的数据量 = PageSize,即每页显示数量。

在使用时,直接实例化类型,并把数据源从构造函数传入,然后绑定到UI上就可以了。

            List<int> list = new List<int>();
for(int x=; x<= ; x++)
{
list.Add(x);
}
PagabledCollection<int> cols = new PagabledCollection<int>(list);
cols.PageSize = ;
rootlayout.DataContext = cols;

而在 XAML 文档中,直接绑定到PagabledCollection实例的各个属性即可。

    <Grid Margin="15" Name="rootlayout">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<ListBox Margin="3" ItemsSource="{Binding PagedItems}"/>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Content="上一页" Margin="0,0,5,0" IsEnabled="{Binding CanPageUp}" Click="OnPageup"/>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="第{0}页 / 共{1}页">
<Binding Path="CurrentPage"/>
<Binding Path="TotalPages"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<Button Content="下一页" Margin="5,0,0,0" IsEnabled="{Binding CanPageDown}" Click="OnPagedown"/>
<TextBlock Margin="3,0,0,0">每页显示条数:</TextBlock>
<TextBox Width="30" Text="{Binding Path=PageSize,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="显示全部" Click="OnShowAll" Margin="13,0,0,0"/>
</StackPanel>
</Grid>

最后,运行程序,效果基本满意。

这个类嘛,写得不算专业,总体来说属于娱乐层次,就给大家用来做入门学习参考吧。

示例源代码下载

【WPF】闲着没事,写了个支持数据列表分页的帮助类的更多相关文章

  1. 还敢说你是程序员?一律师闲着没事写了个app,用户量600万

    今天周五,是我在上海上班的第五天. 这几天怎么说呢,跟混日子差不多,因为处处有“”惊喜”. 上班第一天领来办公电脑,登上自己的公司邮箱,惊喜来了!我的擦擦擦,全TM是英文呐!作为一个从村儿里来的码农, ...

  2. 闲着没事写点啥之springmvc梳理

    用户通过浏览器向服务器发送请求,请求被springmvc的前端控制器dispatcherservlet拦截. dispatcherservlet拦截到请求后,会调用handlermapping处理器映 ...

  3. 分享自研实现的多数据源(支持同DB不同表、跨DB表、内存数据、外部系统数据等)分页查询工具类实现原理及使用

    思考: 提起分页查询,想必任何一个开发人员(不论是新手还是老手)都能快速编码实现,实现原理再简单不过,无非就是写一条SELECT查询的SQL语句,ORDER BY分页排序的字段, 再结合limit ( ...

  4. .NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)

    说说WebForm: 数据列表控件: WebForm 下的列表绑定控件基本就是GridView.DataList.Repeater:当然还有其它DropDownList.ListBox等. 它们的共同 ...

  5. WPF MVVM从入门到精通8:数据验证

    原文:WPF MVVM从入门到精通8:数据验证 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF M ...

  6. 在WPF对话框中如何验证用户提供的数据

    在WPF中,MS在msdn的WPF应用程序开发中对用户输入的数据验证做了示范,基本思想就是添加各种类型的校验规则,比如最大最小值.字符串长度.是否为空等等,在后在界面绑定数据时添加数据字段的校验.这样 ...

  7. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  8. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

  9. PHP+jQuery 长文章分页类 ( 支持 url / ajax 分页方式 )

    /* ******* 环境:Apache2.2.8 ( 2.2.17 ) + PHP5.2.6 ( 5.3.3 ) + MySQL5.0.51b ( 5.5.8 ) + jQuery-1.8 **** ...

随机推荐

  1. Travis CI用来持续集成你的项目

    这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...

  2. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  3. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  4. 使用python抓取婚恋网用户数据并用决策树生成自己择偶观

    最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...

  5. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  6. 零OCR基础6行代码实现C#验证码识别

    这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...

  7. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  8. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  9. SharePoint 2016 入门视频教程

    之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要 ...

  10. 一个简单的网站web项目的详解

    有不对的术语,或者不好理解的部分,欢迎大家批评指正,谢谢大家! 近期做的网站web项目,实现登录功能,查询功能.首先把这个项目分为几个模块来处理,当前用户模块,历史用户模块,历史记录模块,数据库模块, ...