按钮在一列中,获取Click事件处理程序所在的行

时间:2009-07-23 00:26:31

标签: c# wpf xaml datagrid datagridview

我已将WPF Datagrid的itemsource设置为从DAL返回的对象列表。我还添加了一个包含按钮的额外列,xaml位于下方。

<toolkit:DataGridTemplateColumn  MinWidth="100" Header="View">
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Click="Button_Click">View Details</Button>
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

这很好。但是在 Button_Click 方法中,有什么方法可以获取按钮所在的数据网格中的行?更具体地说,我的对象的一个​​属性是“Id”,我希望能够将它传递给事件处理程序中另一个表单的构造函数。

private void Button_Click(object sender, RoutedEventArgs e)
    {
        //I need to know which row this button is on so I can retrieve the "id"  
    }

也许我在我的xaml中需要额外的东西,或者我可能会以迂回的方式进行此操作?任何帮助/建议表示赞赏。

5 个答案:

答案 0 :(得分:115)

基本上,您的按钮将继承行数据对象的datacontext。我将其称为MyObject,希望MyObject.ID是你想要的。

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Do whatever you wanted to do with MyObject.ID
}

答案 1 :(得分:41)

我喜欢这样做的另一种方法是将ID绑定到按钮的CommandParameter属性:

<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>

然后您可以在代码中访问它:

private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}

答案 2 :(得分:10)

另一种绑定命令参数DataContext并尊重MVVM的方式,比如Jobi Joy,说按钮继承了datacontext表格行。

XAML中的按钮

<RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>

命令实现

public void Execute(object parameter)
    {
        if (parameter is MyObject)
        {

        }
    }

答案 3 :(得分:3)

MyObject obj= (MyObject)((Button)e.Source).DataContext;

答案 4 :(得分:0)

如果您的DataGrid的DataContext是DataView对象(DataTable的DefaultView属性),那么您也可以这样做:

private void Button_Click(object sender, RoutedEventArgs e) {
   DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}