Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按钮,在单击事件处理程序上获取它所来自的行_C#_Wpf_Xaml_Datagrid_Datagridview - Fatal编程技术网

C# 按钮,在单击事件处理程序上获取它所来自的行

C# 按钮,在单击事件处理程序上获取它所来自的行,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="

我已经将WPF数据网格的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>

也许我在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;
}