Avalonia 的
DataGrid本身不内置分页控件,也不支持服务端分页或虚拟滚动式分页,但可以通过“数据层分页 + UI 触发机制”来实现类似效果。核心思路是:只加载当前页的数据,配合分页导航按钮(如上一页/下一页/跳转)动态请求或切换数据源。
手动管理分页状态 + 切换 ObservableCollection
最直接的方式是维护当前页码、每页条数、总记录数等状态,每次翻页时重新生成一个子集的
ObservableCollection<t></t>并赋值给
DataGrid.ItemsSource: 定义分页属性(如
CurrentPage、
PageSize、
TotalCount) 封装一个
LoadPage(int page)方法,从原始数据(或通过 API)截取对应范围数据 用
new ObservableCollection<t>(data.Skip((page-1)*PageSize).Take(PageSize))</t>创建新集合 绑定到
DataGrid.ItemsSource,注意要替换整个集合(不是 Clear+Add),否则可能触发重绘异常
结合 IReactiveList 或第三方分页组件(如 Avalonia.Controls.Pagination)
社区已有轻量分页控件(如 Avalonia.Controls.Pagination),它提供
PaginationControl,可绑定页码变化事件: 在 XAML 中引入命名空间并放置分页控件:
<paginationcontrol currentpage="{Binding CurrentPage}" totalitems="{Binding TotalCount}" pagesize="{Binding PageSize}"></paginationcontrol>
在 ViewModel 中监听 CurrentPage属性变更,触发数据重载 适合搭配 MVVM 使用,解耦 UI 与分页逻辑
服务端分页(推荐用于大数据量)
若数据来自后端 API(如 REST),应避免一次性拉取全部数据。典型做法:
API 支持page和
pageSize查询参数(例如
/api/users?page=2&pageSize=20) ViewModel 中用
IAsyncRelayCommand封装异步加载逻辑,显示加载状态(如禁用按钮、加 Loading 提示) 成功后更新
ItemsSource和
TotalCount,分页控件会自动刷新页码总数 注意处理错误和空数据场景,避免 UI 崩溃
性能优化小技巧
即使做了分页,也要注意 DataGrid 渲染效率:
确保数据模型类实现INotifyPropertyChanged(仅当需要局部刷新时) 关闭不必要的功能:设置
CanUserResizeColumns="False"、
CanUserSortColumns="False"可提升初始渲染速度 避免在
DataGridTemplateColumn中嵌套复杂控件;简单展示优先用
DataGridTextColumn如需滚动加载(无限滚动),可用
ScrollViewer.ViewChanged监听到底部,再加载下一页(需自行控制防重复触发)
基本上就这些。Avalonia 分页本质是数据驱动,没有“开箱即用”的分页 DataGrid,但逻辑清晰、控制自由度高。关键是把分页逻辑收口到 ViewModel,UI 层只负责触发和展示。
