如何在WPF Datagrid的第一列中显示行号

Har*_*dik 6 wpf wpf-controls wpfdatagrid

在搜索时我发现,行号可以很容易地设置为RowHeader:

void datagrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
     e.Row.Header = e.Row.GetIndex(); 
} 
Run Code Online (Sandbox Code Playgroud)

它在RowHeader中设置行号.但我想将行号显示在第一列

任何人都可以帮助我如何实现这一目标?谢谢

And*_*ndy 15

可能有一种更简单的方法可以做到这一点,但我通过在DataGridRow类上使用GetIndex()方法来实现它.这会将索引返回到数据源,因此可能不完全是您所追求的.

在此输入图像描述

xaml

  <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
        <DataGrid>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Converter={local:RowToIndexConverter}}" />
            </DataGrid.Columns>
            <DataGrid.Items>
                <sys:String>a</sys:String>
                <sys:String>b</sys:String>
                <sys:String>c</sys:String>
                <sys:String>d</sys:String>
                <sys:String>e</sys:String>
            </DataGrid.Items>
        </DataGrid>
    </Window>
Run Code Online (Sandbox Code Playgroud)

和转换器.

public class RowToIndexConverter : MarkupExtension, IValueConverter
{
    static RowToIndexConverter converter;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DataGridRow row = value as DataGridRow;
        if (row != null)
            return row.GetIndex();
        else
            return -1;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (converter == null) converter = new RowToIndexConverter();
        return converter;
    }

    public RowToIndexConverter()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当有许多行并启用行虚拟化时,它不起作用. (4认同)
  • 谢谢安迪,它奏效了.只是一个垃圾编辑,row.GetIndex()+ 1. (3认同)
  • 它几乎对我有用:索引值在绑定到ObservableCollection的新DataGrid上是正确的,但是如果删除了一个元素,则删除项上方元素的索引值不会更新(所以最终得到"0, 1,2,4,......") (2认同)