186 lines
5.3 KiB
C#
186 lines
5.3 KiB
C#
|
|
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; }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|