20230201_145_upperpc/InSituLaboratory.Controls/PaginationModel.cs

186 lines
5.3 KiB
C#
Raw Normal View History

2024-03-27 09:27:10 +00:00
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace InSituLaboratory.Controls
{
public class PaginationModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public ICommand NavCommand { get; set; }
public ObservableCollection<PageNumberModel> PageNumList { get; set; } =
new ObservableCollection<PageNumberModel>();
//public int PerPageCount { get; set; } = 20;
private int _pageSize = 20;
public int PageSize
{
get { return _pageSize; }
set
{
_pageSize = value;
NavCommand?.Execute(PageIndex);
}
}
private int _pageIndex = 1;
public int PageIndex
{
get { return _pageIndex; }
set
{
if (value <= 0)
_pageIndex = 1;
else
_pageIndex = value;
}
}
private bool _isCanPrevious = true;
public bool IsCanPrevious
{
get => _isCanPrevious;
set
{
this._isCanPrevious = value;
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsCanPrevious"));
}
}
private bool _isCanNext = true;
public bool IsCanNext
{
get => _isCanNext;
set
{
this._isCanNext = value;
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsCanNext"));
}
}
private int _previousIndex;
/// <summary>
/// 前一条数据的Index 如果当前Index=2 1 3
/// </summary>
public int PreviousIndex
{
get => _previousIndex;
set
{
this._previousIndex = value;
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("PreviousIndex"));
}
}
private int _nextIndex;
public int NextIndex
{
get => _nextIndex;
set
{
this._nextIndex = value;
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("NextIndex"));
}
}
/// <summary>
/// 填充刷新页码
/// </summary>
/// <param name="sumCount">数据总条目数</param>
public void FillPageNumbers(int sumCount)
{
// 总条目数100 per 20 num=5
// 第一次刷新pageIndex=1
// 第二次刷新点击了页码5
// 第三次刷新:因为重新选择了每页数量 per 30 num=4
// 简单点的话当重新选择了每页数量后直接从1页开始
// 算法处理一下的话:页码超出范围,显示最后一页
// 这里进行PageNumList的修改 3.0 2 =1.5 == 2
int num_count = (int)Math.Ceiling(sumCount * 1.0 / PageSize);
if (PageIndex > num_count) PageIndex = num_count;
this.PreviousIndex = PageIndex - 1;
this.NextIndex = PageIndex + 1;
// 处理前一页和后一页按钮的可用性
//if (PageIndex == 1)
IsCanPrevious = PageIndex != 1;
//if (PageIndex == num_count)
IsCanNext = PageIndex != num_count;
// 页面的显示
// 20 30 40 导致页面显示不了
// 1 2 3 4 5 6 ... 16
// 1 ... 7 8 9 10 11 12 13 ... 16
// 1 ... 11 12 13 14 15 16
int min = PageIndex - 4;
if (min <= 1) min = 1;
else min = PageIndex - 3;
int max = PageIndex + 4;
if (PageIndex <= 5)
max = Math.Min(9, num_count);
else
{
if (max >= num_count) max = num_count;
else max = PageIndex + 3;
}
if (PageIndex >= num_count - 4)
min = Math.Max(1, num_count - 8);
List<string> temp = new List<string>();
if (min > 1)
{
temp.Add("1");
temp.Add("···");
}
for (int i = min; i <= max; i++)
temp.Add(i.ToString());
if (max < num_count)
{
temp.Add("···");
temp.Add(num_count.ToString());
}
PageNumList.Clear();
//for (int i = 1; i <= num_count; i++)
foreach (string str in temp)
{
bool state = int.TryParse(str, out int index);
PageNumList.Add(new PageNumberModel
{
Index = str,
IsCurrent = (index == PageIndex),
IsEnabled = state
});
}
}
public class PageNumberModel
{
public string Index { get; set; }
public bool IsEnabled { get; set; } = true;
public bool IsCurrent { get; set; }
}
}
}