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

Rek*_*moc 94 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>
Run Code Online (Sandbox Code Playgroud)

这很好.但是在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"  
    }
Run Code Online (Sandbox Code Playgroud)

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

Job*_*Joy 122

基本上,您的按钮将继承行数据对象的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
}
Run Code Online (Sandbox Code Playgroud)

  • 执行此类操作的理想方法是使用命令(基本上是MVVM模式),您可以在数据对象(ViewModel)中创建命令并调用Button.Command,这样就不会出现像Button一样的任何代码. (7认同)
  • 你能用命令证明这样做吗? (3认同)

xr2*_*0xr 44

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

<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>
Run Code Online (Sandbox Code Playgroud)

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

private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}
Run Code Online (Sandbox Code Playgroud)


小智 10

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

XAML中的按钮

<RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>
Run Code Online (Sandbox Code Playgroud)

命令实现

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

        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

MyObject obj= (MyObject)((Button)e.Source).DataContext;
Run Code Online (Sandbox Code Playgroud)