Pagination使用说明

在MVVM模式中使用

#region Pagination在MVVM模式下使用的所有步骤
//第一步,添加using
using Suresking.Styles;
//第二步,准备后台总List<T>和前台显示的ObservableCollection<T>
private List<Student> totalStudents;
private ObservableCollection<Student> _Students;
public ObservableCollection<Student> Students
{
    get { return _Students; }
    set { SetProperty(ref _Students, value); }
}
//第三步,定义一个私有常量PAGESIZE存放每页显示条数
// 定义一个属性PageIndex存放当前页码
// 以及一个属性PageCount存放总共有多少页
// 这两个属性需要绑定在前台xaml文件的Pagination控件
private const int PAGESIZE = 8;
private int _PageCount;
public int PageCount
{
    get { return _PageCount; }
    set { SetProperty(ref _PageCount, value); }
}
private int _PageIndex;
public int PageIndex
{
    get { return _PageIndex; }
    set
    {
        if(value<1) SetProperty(ref _PageIndex, 1);
        else if(value>PageCount) SetProperty(ref _PageIndex, PageCount);
        else SetProperty(ref _PageIndex, value);
    }
}
//第四步,定义一个函数来显示当前页的具体数据,因为可能多处这样操作,所以必须是函数
//       包括而不限于:初始化、页码改变事件触发、后台总数据改变触发
//       也可以定义俩函数,因为单纯的页码改变触发时无需计算PageCount
private void PageIndexChangedCallback(int pi)
{
    PageCount = (totalStudents.Count % PAGESIZE) > 0 ? totalStudents.Count / PAGESIZE + 1 : totalStudents.Count / PAGESIZE;
    PageIndex = pi;
    // 下面这句必须用PageIndex,因为删除最后一页唯一项时会造成info滞后于PageCount,但PageIndex有拦截机制,可避免
    Students = new ObservableCollection<Student>(totalStudents.Skip((PageIndex - 1) * PAGESIZE).Take(PAGESIZE));
}
//第五步,使用zzCmdG模板定义事件转命令的具体内容,T必须是PageUpdatedEventArgs
public DelegateCommand<PageUpdatedEventArgs> ChangeCommand => new DelegateCommand<PageUpdatedEventArgs>(p => {
    if (p != null) PageIndexChangedCallback(p.Info);
});
//前台xaml代码如下
/******************************************
// 最开始安装NuGet包 Microsoft.Xaml.Behaviors.Wpf
// 然后引入命名空间
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
// 文件内部代码
<ws:Pagination Grid.Row="2" PageIndex="{Binding PageIndex}" PageCount="{Binding PageCount}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PageUpdated">
            <i:InvokeCommandAction Command="{Binding ChangeCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ws:Pagination>
******************************************/
#endregion

在后台代码使用

这样使用比较简单,因为他页码变化的事件直接在后台代码就能处理
首先,前台xaml文件中给控件起个名字以便于后台操作,
其次

private void page_PageUpdated(object sender, Suresking.Styles.PageUpdatedEventArgs e)
{
    InitPage(e.Info);
}
private void InitPage(int currentpage)
{
    page.PageCount = drugDTOs.Count % PAGESIZE > 0 ? drugDTOs.Count / PAGESIZE + 1 : drugDTOs.Count / PAGESIZE;
    if (currentpage < 1) currentpage = 1;
    if (currentpage > page.PageCount) currentpage = page.PageCount;
    page.PageIndex = currentpage;
    dgDrugDTOs.ItemsSource = drugDTOs.Skip((currentpage - 1) * PAGESIZE).Take(PAGESIZE);
}
posted @ 2022-04-01 20:36  情怀丶感伤  阅读(258)  评论(0编辑  收藏  举报