C# 按钮,在单击事件处理程序上获取它所来自的行
我已经将WPF数据网格的itemsource设置为从DAL返回的对象列表。我还添加了一个额外的列,其中包含一个按钮,下面是xamlC# 按钮,在单击事件处理程序上获取它所来自的行,c#,wpf,xaml,datagrid,datagridview,C#,Wpf,Xaml,Datagrid,Datagridview,我已经将WPF数据网格的itemsource设置为从DAL返回的对象列表。我还添加了一个额外的列,其中包含一个按钮,下面是xaml <toolkit:DataGridTemplateColumn MinWidth="100" Header="View"> <toolkit:DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Click="
<toolkit:DataGridTemplateColumn MinWidth="100" Header="View">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Click="Button_Click">View Details</Button>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
也许我在xaml中需要一些额外的东西,或者我正在以一种迂回的方式处理这个问题?欢迎提供任何帮助/建议。基本上,您的按钮将继承行数据对象的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
}
另一种方法是将ID绑定到按钮的CommandParameter属性:
<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>
另一种绑定到命令参数DataContext并尊重MVVM的方法,如Jobi Joy所说,按钮继承DataContext表单行 XAML中的按钮
<RadButton Content="..." Command="{Binding RowActionCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>
如果DataGrid的DataContext是DataView对象(DataTable的DefaultView属性),则还可以执行以下操作:
private void Button_Click(object sender, RoutedEventArgs e) {
DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}
完成这类工作的理想方法是使用命令(基本上是MVVM模式)。您可以在数据对象(ViewModel)中创建一个命令并调用Button.command,这样就不会有任何类似按钮单击的代码。@JobiJoy:您有使用命令/RelayCommand的示例吗?我尝试了一些事情,但无法使其工作..我看到的命令示例的问题是,您必须将datagrid所选项数据绑定到视图模型的成员,因此很难对命令进行足够的泛化,以适合使用delete按钮。我想要一个删除按钮模板列资源,我可以用它来删除我应用程序中的几乎所有内容。那么,RowActionCommand是在模型中还是将按钮的datacontext重置为ViewModel?@PetrŠebesta“RowActionCommand是在每个行视图模型中定义的。”这没有任何意义。但无论如何,这是一个很好的解决方案。你为什么把事件和命令混在一起?使用命令并使用其中的命令参数。3答案:为什么不?简单OP询问的是事件处理程序,而不是命令。一个命令可能太过分了。使用
CommandParameter
可能不是属性的预期用途,但在语义上,它比使用Tag
更有意义,也比从处理程序中的绑定对象检索ID更简单。如果您喜欢命令,这种方法很好,但是如果您不打算使用它,为什么还要增加复杂性呢?它应该是e.OriginalSource
。而不是e.Source
。严肃地说,我的答案来自真实的、实时的、工作的代码!
MyObject obj= (MyObject)((Button)e.Source).DataContext;
<RadButton Content="..." Command="{Binding RowActionCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>
public void Execute(object parameter)
{
if (parameter is MyObject)
{
}
}
private void Button_Click(object sender, RoutedEventArgs e) {
DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}