如何根据按下的行的按钮获取数据网格wpf中的行索引

时间:2016-01-04 15:33:02

标签: .net wpf

我在wpf中有一个datagrid,每行有一个编辑按钮。如何获得焦点的行索引,即单击编辑按钮的行?

1 个答案:

答案 0 :(得分:0)

如果您的商品是唯一的,则可以在您的收藏集中使用IndexOf(item)检索索引。所以,你基本上需要你的物品和你的收藏品,那么你很高兴。

您可以通过提供DataGrid名称轻松地在代码后面访问该集合。对于该项目,您可以从ButtonDataGridRow遍历可视树,然后使用其DataGridRow.Item属性。

<DataGrid x:Name="dataGrid1" ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Button Column">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Click="Button_Click" Content="Edit"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我假设网格的DataContext是项目集合。

在代码后面,处理Button_Click事件。我使用辅助方法递归地找到DataGridRow

private void Button_Click(object sender, RoutedEventArgs e)
{
    var row = GetParent<DataGridRow>((Button)sender);
    var index = dataGrid1.Items.IndexOf(row.Item);
    MessageBox.Show("Index = " + index, "Clicked Value");
}

private TargetType GetParent<TargetType>(DependencyObject o)
    where TargetType : DependencyObject
{
    if (o == null || o is TargetType) return (TargetType)o;
    return GetParent<TargetType>(VisualTreeHelper.GetParent(o));
}

这应该会显示一个消息框,显示列的索引。

但是,在大多数情况下,人们实际上并不需要索引,而是希望访问索引后面的项目。在这种情况下,只需忘记IndexOf部分,然后按原样row.Item