DataGrid将命令绑定到行选择

问题描述 投票:16回答:1

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

我看到可以将单元格内容包装在按钮中(尽管我不希望按钮样​​式)-但我不想在单元格级别上进行。

我还看到可以使用行为将命令链接到事件。但最好不要为这种常见任务而采取举止。

是否可以通过简单的旧命令数据绑定来做到这一点?

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

wpf select data-binding datagrid command
1个回答
43
投票

您应使用“交互性”程序集和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"

此外,您还可以将绑定写入DataGrid的SelectedItem属性,并且可以在set访问器中调用命令,但是我上面介绍的第一个解决方案更好。

如果要从主视图模型调用命令并从SelectedItem传递DataGrid,则可以使用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>
© www.soinside.com 2019 - 2024. All rights reserved.