在数据网格上右键单击事件后设置的SelectedItem

本文关键字:事件 设置 SelectedItem 单击 右键 数据 数据网 网格 | 更新日期: 2023-09-27 18:08:40

我有一个DataGrid如下

<DataGrid Margin="10,89,10,10" 
          AlternatingRowBackground="#FFB9E2FF" 
          ItemsSource="{Binding ResultDetails, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
          SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
          AutoGenerateColumns="True" 
          CanUserAddRows="False" 
          IsReadOnly="True" 
          SelectionMode="Single">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseRightButtonUp">
            <cmd:EventToCommand Command="{Binding ResultGridMouseClickCommand, Mode=OneWay}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseDoubleClick">
            <cmd:EventToCommand Command="{Binding ResultGridDblClickCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>

我有一个RelayCommand来处理MouseRightButtonUp事件

private void ExecResultGridMouseClickCommand()
{
    if (SelectedItem == null) return;
    DisplayInfo(SelectedItem);
}

假设我在DataGrid中有5个项目:Item1第二条Item3Item4Item5

DataGrid init时,SelectedItem为null。然后用户右键单击Item3, RelayCommand触发,但SelectedItem仍然为空。用户右键点击Item1, RelayCommand再次启动,然而,SelectedItem返回Item3,我的代码显示了错误的项目详细信息。

是否可以检索在MouseRightButtonUp事件中选择的项目?或者我应该用其他事件代替?

在数据网格上右键单击事件后设置的SelectedItem

IMHO,最好的方法是对DataGridRow应用样式,这样可以确保命令应用于用户实际单击的项目,而忘记SelectedItem。注意:

  • DataContext现在将项目本身,而不是集合。
  • 不能在Style中使用<i:Interaction.Triggers>。似乎有变通的办法。或者你可以尝试切换到强大的附加命令行为:这里有一个样式内使用的例子,第二个答案。