在Avalonia中,DataGrid本身不内置行号列,但可以通过自定义列 + 绑定表达式实现稳定、可复用的行号显示,无需依赖第三方库或修改底层逻辑。
用DataGridTextColumn绑定行索引
最直接的方式是添加一列 DataGridTextColumn,其 Binding 使用 Converter 或 MultiBinding + 转换器 获取当前行在 ItemsSource 中的索引。由于 Avalonia 不支持像 WPF 那样的
AlternationIndex,需手动计算: 确保 ItemsSource 是
ObservableCollection<t></t>或支持索引访问的集合(如
List<t></t>) 在 ViewModel 中暴露一个只读属性(例如
RowNumber),或在 Model 中添加计算属性:
public int RowNumber => IndexOf(this) + 1; // 需配合集合管理索引 更推荐方式:在 XAML 中使用
MultiBinding绑定
ItemsSource和当前
DataContext,再通过
IMultiValueConverter查找该数据项在集合中的位置
用模板列 + 行加载事件动态赋值
借助
LoadingRow事件,在每一行渲染时设置行号值: 在 ViewModel 中为每条数据添加
RowNo属性(初始化时按顺序赋值) XAML 中定义列:
<datagridtextcolumn header="#" binding="{Binding RowNo}" width="40"></datagridtextcolumn>
若数据会增删,记得在操作后重置 RowNo并触发
NotifyPropertyChanged
避免用 DataTable 或 DataView 做数据源
Avalonia 的 DataGrid 对
DataTable/
DataView支持不完整,绑定后无法自动识别行序或触发刷新。即使强行绑定,
DataRowView.RowNumber等属性也无法在 UI 层可靠映射。务必改用强类型集合(如
ObservableCollection<person></person>)并自行维护序号逻辑。
扩展性提示:封装成可复用行为
如果项目中多处需要行号,可封装一个附加属性或 Behavior:
定义AttachedProperty<int> RowIndexProperty</int>,在
LoadingRow中赋值 配合样式,让首列自动显示该附加属性值 这样只需在 XAML 中写
local:DataGridHelper.ShowRowNumber="True"即可启用
基本上就这些。核心是放弃“自动行号”幻想,主动管理序号——既可控,又兼容排序、筛选后的动态更新。
