18

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

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

我还看到可以使用行为将命令链接到事件。但最好我不应该为了这样一个共同的任务而诉诸行为。

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

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

4

2 回答 2

50

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

当 items 有自己的命令时,您可以使用以下代码:

<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>
于 2013-03-10T21:07:56.457 回答
1

请注意,@kmatyaszek 的答案在 .NET 5.0 及更高版本中已过时,我们应该使用Microsoft.Xaml.Behaviors而不是Microsoft.Expression.Interactions.

所以i命名空间中的应该是:

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

有关详细信息,请参见此处

于 2021-11-16T03:32:38.953 回答