DataGrid列中的列/行索引

时间:2014-02-08 16:53:05

标签: .net wpf xaml binding datagrid

我希望以下内容能让我获得单元格中的列索引:

<DataGridTemplateColumn Header="Rec. No." Width="100" IsReadOnly="True">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
              <TextBlock Text="{Binding Source={RelativeSource AncestorType=DataGridCell}, Path=Column.DisplayIndex}" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但事实并非如此。任何人都可以告诉我这里有什么问题?

我实际上在寻找行索引(我的网格中需要一个记录编号列),但由于DataGridRow显然没有“索引”类属性,我试图先做对于列索引,已获得DisplayIndex。但即便是这个也行不通。

1 个答案:

答案 0 :(得分:3)

绑定语法不正确。而不是Source,它应该是RelativeSource

Text="{Binding RelativeSource={RelativeSource AncestorType=DataGridCell}, 
               Path=Column.DisplayIndex}"

对于获取RowIndex的第二个问题,DataGridRow上没有内置属性,例如RowIndex

我建议在底层数据类中使用一些属性并绑定到该属性。

但是,您也可以通过 IValueConverter 手动获取rowIndex。

public class RowIndexConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        DependencyObject item = (DependencyObject)value;
        ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);

        return ic.ItemContainerGenerator.IndexFromContainer(item);
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

<强> XAML:

<TextBlock
     Text="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, 
                          Converter={StaticResource RowIndexConverter}}"/>

当然,您需要在XAML的资源部分声明Converter的实例才能使用它。