Avalonia DataGrid 无内置分页,需通过数据层分页实现:手动管理页码状态并替换 ObservableCollection;或集成 PaginationControl 等第三方控件;服务端分页推荐用于大数据,配合异步加载与错误处理;辅以渲染优化提升性能。

Avalonia 的 DataGrid 本身不内置分页控件,也不支持服务端分页或虚拟滚动式分页,但可以通过“数据层分页 + UI 触发机制”来实现类似效果。核心思路是:只加载当前页的数据,配合分页导航按钮(如上一页/下一页/跳转)动态请求或切换数据源。
手动管理分页状态 + 切换 ObservableCollection
最直接的方式是维护当前页码、每页条数、总记录数等状态,每次翻页时重新生成一个子集的 ObservableCollection 并赋值给 DataGrid.ItemsSource:
- 定义分页属性(如
CurrentPage、PageSize、TotalCount) - 封装一个
LoadPage(int page)方法,从原始数据(或通过 API)截取对应范围数据 - 用
new ObservableCollection创建新集合(data.Skip((page-1)*PageSize).Take(PageSize)) - 绑定到
DataGrid.ItemsSource,注意要替换整个集合(不是 Clear+Add),否则可能触发重绘异常
结合 IReactiveList 或第三方分页组件(如 Avalonia.Controls.Pagination)
社区已有轻量分页控件(如 Avalonia.Controls.Pagination),它提供 PaginationControl,可绑定页码变化事件:
- 在 XAML 中引入命名空间并放置分页控件:
- 在 ViewModel 中监听
CurrentPage属性变更,触发数据重载 - 适合搭配 MVVM 使用,解耦 UI 与分页逻辑
服务端分页(推荐用于大数据量)
若数据来自后端 API(如 REST),应避免一次性拉取全部数据。典型做法:
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
- 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 层只负责触发和展示。









