我已将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中需要额外的东西,或者我可能会以迂回的方式进行此操作?任何帮助/建议表示赞赏。
答案 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;
}