|
|
using Prism.Mvvm;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows.Input;
|
|
|
|
|
|
namespace Txgy.Controls
|
|
|
{
|
|
|
public class PaginationModel : BindableBase
|
|
|
{
|
|
|
#region 构造函数
|
|
|
public PaginationModel() { }
|
|
|
/// <summary>
|
|
|
///
|
|
|
/// </summary>
|
|
|
/// <param name="navCommand">导航到某页,可以知道需要请求哪一个页面的数据</param>
|
|
|
/// <param name="countChangeCommand">修改每页的显示数量的时候触发请求数据</param>
|
|
|
public PaginationModel(ICommand navCommand, ICommand countChangeCommand)
|
|
|
{
|
|
|
NavCommand = navCommand;
|
|
|
CountPerPageChangeCommand = countChangeCommand;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
public ICommand NavCommand { get; set; }
|
|
|
public ICommand CountPerPageChangeCommand { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 所有的可显示页 240 24 1-24
|
|
|
/// </summary>
|
|
|
public ObservableCollection<PaginationItemModel> Pages { get; set; } = new ObservableCollection<PaginationItemModel>();
|
|
|
private int _countPerPage = 10;
|
|
|
/// <summary>
|
|
|
/// 每页的显示数据条数
|
|
|
/// </summary>
|
|
|
public int CountPerPage
|
|
|
{
|
|
|
get => _countPerPage;
|
|
|
set { SetProperty<int>(ref _countPerPage, value); }
|
|
|
}
|
|
|
|
|
|
private int _previousIndex;
|
|
|
/// <summary>
|
|
|
/// 前一条数据的Index 如果当前Index=2 1 3
|
|
|
/// </summary>
|
|
|
public int PreviousIndex
|
|
|
{
|
|
|
get => _previousIndex;
|
|
|
set { SetProperty<int>(ref _previousIndex, value); }
|
|
|
}
|
|
|
|
|
|
private int _nextIndex;
|
|
|
public int NextIndex
|
|
|
{
|
|
|
get => _nextIndex;
|
|
|
set { SetProperty<int>(ref _nextIndex, value); }
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 也可以通过命令的
|
|
|
/// </summary>
|
|
|
private bool _isCanPrevious = true;
|
|
|
public bool IsCanPrevious
|
|
|
{
|
|
|
get => _isCanPrevious;
|
|
|
set { SetProperty<bool>(ref _isCanPrevious, value); }
|
|
|
}
|
|
|
|
|
|
private bool _isCanNext = true;
|
|
|
public bool IsCanNext
|
|
|
{
|
|
|
get => _isCanNext;
|
|
|
set { SetProperty<bool>(ref _isCanNext, value); }
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 填充页码
|
|
|
/// </summary>
|
|
|
/// <param name="sumCount">总记录数(数据库中的当的所有有效数据的条数)</param>
|
|
|
/// <param name="pageCode">当前页码</param>
|
|
|
public void FillPages(int sumCount, int pageCode)
|
|
|
{
|
|
|
IsCanPrevious = true;
|
|
|
IsCanNext = true;
|
|
|
PreviousIndex = pageCode - 1;
|
|
|
NextIndex = pageCode + 1;
|
|
|
|
|
|
// 总页数
|
|
|
int pageCount = (int)Math.Ceiling(sumCount * 1.0 / CountPerPage);
|
|
|
if (pageCode > pageCount) pageCode = pageCount;
|
|
|
|
|
|
// 处理前一页和后一页按钮的可用性
|
|
|
if (pageCode == 1)
|
|
|
IsCanPrevious = false;
|
|
|
if (pageCode == pageCount)
|
|
|
IsCanNext = false;
|
|
|
|
|
|
|
|
|
List<object> temp = new List<object>();
|
|
|
// 1 2 3 4 [5] 6 7 8 9 ... 15
|
|
|
// 1 ... 3 4 5 [6] 7 8 9... 15
|
|
|
// 1 ... 7 8 9 [10] 11 12 13 ... 15
|
|
|
// 1 ... 8 9 10 [11] 12 13 14 15 10条 50条
|
|
|
// 省略首页和尾页
|
|
|
|
|
|
int min = pageCode - 4;
|
|
|
if (min <= 1) min = 1;
|
|
|
else min = pageCode - 3;
|
|
|
|
|
|
int max = pageCode + 4;
|
|
|
if (pageCode <= 5) max = Math.Min(9, pageCount);
|
|
|
else
|
|
|
{
|
|
|
if (max >= pageCount) max = pageCount;
|
|
|
else max = pageCode + 3;
|
|
|
}
|
|
|
if (pageCode >= pageCount - 4)
|
|
|
min = Math.Max(1, pageCount - 8);
|
|
|
|
|
|
|
|
|
if (min > 1)
|
|
|
{
|
|
|
temp.Add(1);
|
|
|
temp.Add("...");
|
|
|
}
|
|
|
for (int i = min; i <= max; i++)
|
|
|
temp.Add(i);
|
|
|
if (max < pageCount)
|
|
|
{
|
|
|
temp.Add("...");
|
|
|
temp.Add(pageCount);
|
|
|
}
|
|
|
|
|
|
int index;
|
|
|
Pages.Clear();
|
|
|
foreach (var item in temp)
|
|
|
{
|
|
|
bool state = int.TryParse(item.ToString(), out index);
|
|
|
Pages.Add(new PaginationItemModel
|
|
|
{
|
|
|
Index = (state ? index : item),
|
|
|
IsCurrent = index == pageCode,
|
|
|
IsEnabled = state
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public class PaginationItemModel : BindableBase
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 页码(都是数字,不一定,需要对不能显示的页码进行隐藏:... )
|
|
|
/// </summary>
|
|
|
public object Index { get; set; }
|
|
|
public bool IsEnabled { get; set; } = true;
|
|
|
/// <summary>
|
|
|
/// 选中状态
|
|
|
/// </summary>
|
|
|
private bool _isCurrent;
|
|
|
public bool IsCurrent
|
|
|
{
|
|
|
get => _isCurrent;
|
|
|
set { SetProperty<bool>(ref _isCurrent, value); }
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|