在DataGrid上的Right Click事件之后设置SelectedItem

时间:2014-06-16 04:02:07

标签: c# wpf datagrid mvvm-light relaycommand

我有一个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个项目:     项目1     项目2     项目3     项目4     ITEM5

DataGrid初始化时,SelectedItem为空。 然后,用户右键点击Item3RelayCommand,但SelectedItem仍然为空。 用户右键点击Item1RelayCommand再次触发,但SelectedItem返回Item3,我的代码显示错误的商品详情。

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

1 个答案:

答案 0 :(得分:0)

恕我直言,最好的方法是将样式应用于DataGridRow,这样就可以确保将命令应用于用户实际点击的项目,并且忘记了SelectedItem。请注意以下事项:

  • DataContext现在将是项目本身而不是集合。
  • 您无法在<i:Interaction.Triggers>内使用Style。似乎有workarounds to this。或者您可以尝试切换到强大的附加命令行为:您在样式here中有一个使用示例,第二个答案。