From cb3edfa92c120d96bd995fdc10d3792b2155ebb6 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Sun, 25 May 2025 09:46:01 +0800 Subject: [PATCH] Add CurrentPageChanged support for Pagination --- .../Pagination/PageChangedArgs.cs | 15 +++++++ src/AtomUI.Controls/Pagination/Pagination.cs | 42 ++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/AtomUI.Controls/Pagination/PageChangedArgs.cs diff --git a/src/AtomUI.Controls/Pagination/PageChangedArgs.cs b/src/AtomUI.Controls/Pagination/PageChangedArgs.cs new file mode 100644 index 000000000..5b3be9252 --- /dev/null +++ b/src/AtomUI.Controls/Pagination/PageChangedArgs.cs @@ -0,0 +1,15 @@ +namespace AtomUI.Controls; + +public class PageChangedArgs +{ + public PageChangedArgs(int pageNumber, int totalPages, int pageSize) + { + PageNumber = pageNumber; + TotalPages = totalPages; + PageSize = pageSize; + } + + public int PageSize { get; } + public int TotalPages { get; } + public int PageNumber { get; } +} \ No newline at end of file diff --git a/src/AtomUI.Controls/Pagination/Pagination.cs b/src/AtomUI.Controls/Pagination/Pagination.cs index d57b4c650..fe56b8307 100644 --- a/src/AtomUI.Controls/Pagination/Pagination.cs +++ b/src/AtomUI.Controls/Pagination/Pagination.cs @@ -9,6 +9,7 @@ using AtomUI.Theme.Utils; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; +using Avalonia.Data; using Avalonia.Layout; using Avalonia.LogicalTree; using Avalonia.VisualTree; @@ -50,7 +51,8 @@ public class Pagination : TemplatedControl, AvaloniaProperty.RegisterDirect(nameof(PageSize), o => o.PageSize, (o, v) => o.PageSize = v, - unsetValue: DefaultPageSize); + unsetValue: DefaultPageSize, + enableDataValidation:true); public static readonly DirectProperty TotalProperty = AvaloniaProperty.RegisterDirect(nameof(Total), @@ -106,7 +108,14 @@ public class Pagination : TemplatedControl, public int PageSize { get => _pageSize; - set => SetAndRaise(PageSizeProperty, ref _pageSize, value); + set + { + if (!new[] { 10, 20, 50, 100 }.Contains(value)) + { + throw new ArgumentException("PageSize only allow: 10, 20, 50, 100"); + } + SetAndRaise(PageSizeProperty, ref _pageSize, value); + } } private long _total; @@ -156,6 +165,10 @@ public class Pagination : TemplatedControl, set => SetValue(IsMotionEnabledProperty, value); } #endregion + + #region 公共事件定义 + public event EventHandler? CurrentPageChanged; + #endregion #region 内部属性定义 @@ -316,6 +329,7 @@ public class Pagination : TemplatedControl, SetupRightButtonRange(currentPage, pageCount); _paginationNav.SelectedIndex = _selectedNavItemIndex; SetupTotalInfoText(); + CurrentPageChanged?.Invoke(this, new PageChangedArgs(CurrentPage, pageCount, pageSize)); } private void HandlePageNavRequest(object? sender, PageNavRequestArgs args) @@ -427,6 +441,29 @@ public class Pagination : TemplatedControl, SetupQuickJumper(); } } + + if (change.Property == PageSizeProperty) + { + SetupSizeChangerSelected(); + } + } + + private void SetupSizeChangerSelected() + { + if (SizeChanger != null) + { + for (int i = 0; i < SizeChanger.Items.Count; i++) + { + if (SizeChanger.Items.GetAt(i) is PageSizeComboBoxItem pageSizeItem) + { + if (pageSizeItem.PageSize == PageSize) + { + SizeChanger.SelectedIndex = i; + break; + } + } + } + } } private void SetupTotalInfoText() @@ -453,6 +490,7 @@ public class Pagination : TemplatedControl, sizeChanger.SelectedIndex = 0; SizeChanger = sizeChanger; SizeChanger.SelectionChanged += HandlePageSizeChanged; + SetupSizeChangerSelected(); } }