DataGrid绑定命令行选择(DataGrid bind command to row selec

2019-07-21 07:28发布

我想,当用户选择在DataGrid中的行执行命令。

我看到是有可能包裹在按钮单元格内容(虽然我不希望的按钮样式做) - 但我不想在细胞层面做到这一点。

我也看到有可能使用行为的命令链接到的事件。 但最好我不应该诉诸行为,这种共同的任务。

是否有可能通过普通的旧命令绑定做到这一点?

所以:1)用户点击DataGrid行2)上视图模型命令被触发。

提前致谢。

Answer 1:

您应该使用“交互”组装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>

其中“i”为命名空间:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

你也可以写结合SelectedItem DataGrid的财产和set访问,你可以调用你的命令,但我提出你上面的第一个解决方案是更好的。

如果你想从主视图模型调用命令和传递SelectedItemDataGrid您可以使用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>

当项目有自己的命令,你可以用下面的代码:

<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>

或者,如果有元素被分配给它自己的视图模型DataContext ,你可以用下面的代码:

 <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>


文章来源: DataGrid bind command to row select