Wpf DataGrid绑定命令到行选择

Wpf DataGrid绑定命令到行选择,wpf,select,data-binding,datagrid,command,Wpf,Select,Data Binding,Datagrid,Command,我想在用户选择DataGrid中的一行时执行一个命令 我认为可以将单元格内容包装到按钮中(尽管我不想要按钮样式),但我不想在单元格级别这样做 我还发现可以使用行为将命令链接到事件。但我最好不必为这样一个共同的任务求助于行为 是否可以通过普通的旧命令数据绑定来实现这一点 因此:1)用户单击DataGrid第2行)视图模型上的命令被激发。您应该使用“交互”程序集和SelectionChanged事件 <DataGrid AutoGenerateColumns="False" ItemsSour

我想在用户选择DataGrid中的一行时执行一个命令

我认为可以将单元格内容包装到按钮中(尽管我不想要按钮样式),但我不想在单元格级别这样做

我还发现可以使用行为将命令链接到事件。但我最好不必为这样一个共同的任务求助于行为

是否可以通过普通的旧命令数据绑定来实现这一点

因此:1)用户单击DataGrid第2行)视图模型上的命令被激发。

您应该使用“交互”程序集和
SelectionChanged
事件

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding ID}" />
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
    </DataGrid.Columns>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding MyCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>
您还可以将绑定写入DataGrid的
SelectedItem
属性,并在set访问器中调用您的命令,但我上面介绍的第一个解决方案更好

如果要从主视图模型调用命令并从数据网格传递
DataGrid
中的
SelectedItem
,可以使用
CommadParameter

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding MyCommand}" 
        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

到目前为止,将其作为答案进行标记,因为它看起来不错,而且相当简单。谢谢我也尝试过SelectedItem,但由于虚拟化而出现了一些问题。一般来说,DataGrid似乎有一些bug。好的,只是尝试了一下,然后在顶级视图模型上触发,而不是DataGrid中每个元素的视图模型。我想我不能让它直接在相关的视图模型上启动?否则我想我也会使用SelectedItem。@BentRasmussen再次检查我的答案,我添加了更多的例子。竖起三个大拇指!你给我省了一大堆麻烦!我以前背很难看。万分感谢@JonathanTuzman请看这个问题:
<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding MyCommand}" 
        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=SelectedItem.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
 <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=SelectedItem.DataContext.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>