在WPF DataGrid上显示行号的简单方法

我只想在DataGrid的最左侧列中显示行号。 这有什么属性吗?

请记住,这不是我桌子的主键。 当列排序时,我不希望这些行号与其行一起移动。 我基本上想要一个运行计数。 它甚至不需要标题。

一种方法是在DataGrid的LoadingRow事件中添加它们

  

当从源列表中添加或删除项目时,这些数字可能暂时不同步。 有关此问题的修复,请参阅此处附加的行为:
WPF 4 DataGrid:将行号放入RowHeader

可以这样使用

  

添加关于Fredrik Hedblad答案的简短信息。

  

...如果你想从1开始编号

如果数据网格的ItemsSource绑定到集合,请将数据网格的AlternationCount属性绑定到集合的count属性,或绑定到DataGrid的Items.Count属性,如下所示:

  

要么:

  

要么应该工作。

然后,假设您在最左侧的列中使用DataGridTextColumn,则在DataGrid.Columns定义中执行以下操作:

   

如果您不想从0开始,可以在绑定中添加转换器以增加索引。

只是为了增加对此的讨论…(我花了太多时间找到这个!)。

您需要在datagrid上将EnableRowVirtualization设置为False以防止行排序中的错误:

 EnableRowVirtualization="False" 

默认情况下, EnableRowVirtualization属性设置为true 。 当EnableRowVirtualization属性设置为true时,DataGrid不会为绑定数据源中的每个数据项实例化DataGridRow对象。 相反,DataGrid仅在需要时才创建DataGridRow对象,并尽可能多地重用它们。 MSDN参考

这是一个老问题,但我想分享一些东西。 我有一个类似的问题,我需要的只是一个简单的RowHeader行数和Fredrik Hedblad的答案几乎完成了我的问题。

虽然这很棒:

  

删除和添加项目时,我的标题搞砸了。 如果你有按钮负责那只需添加dataGrid.Items.Refresh(); 在我的情况下的'删除'代码下:

 private void removeButton_Click(object sender, RoutedEventArgs e) { // delete items dataGrid.Items.Refresh(); } 

这为我解决了desyncronized计算,因为刷新项再次调用DataGrig_LoadingRow

另一个答案是为新人或匆忙中的人提供几乎复制和粘贴的例子(不被鼓励),灵感来自@GrantA和@Johan Larsson在这篇文章中的答案(+许多其他人回答了关于该主题的众多post)

  • 您可能不希望在列中添加枚举
  • 您无需重新创建自己的附加属性

         ...  ...  ...         

注意括号()(ItemsControl.AlternationIndex)周围警告Fredrik Hedblad在Check中检查Row是否为奇数

在此处输入图像描述

使用附加属性,完整源代码。

 using System.Windows; using System.Windows.Controls; public static class Index { private static readonly DependencyPropertyKey OfPropertyKey = DependencyProperty.RegisterAttachedReadOnly( "Of", typeof(int), typeof(Index), new PropertyMetadata(-1)); public static readonly DependencyProperty OfProperty = OfPropertyKey.DependencyProperty; public static readonly DependencyProperty InProperty = DependencyProperty.RegisterAttached( "In", typeof(DataGrid), typeof(Index), new PropertyMetadata(default(DataGrid), OnInChanged)); public static void SetOf(this DataGridRow element, int value) { element.SetValue(OfPropertyKey, value); } public static int GetOf(this DataGridRow element) { return (int)element.GetValue(OfProperty); } public static void SetIn(this DataGridRow element, DataGrid value) { element.SetValue(InProperty, value); } public static DataGrid GetIn(this DataGridRow element) { return (DataGrid)element.GetValue(InProperty); } private static void OnInChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var row = (DataGridRow)d; row.SetOf(row.GetIndex()); } } 

XAML: