20230201_145_upperpc/InSituLaboratory.Controls/PaginationModel.cs
2024-03-27 17:27:10 +08:00

186 lines
5.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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; }
}
}
}