Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DataGrid上的右键单击事件后选择编辑项集_C#_Wpf_Datagrid_Mvvm Light_Relaycommand - Fatal编程技术网

C# 在DataGrid上的右键单击事件后选择编辑项集

C# 在DataGrid上的右键单击事件后选择编辑项集,c#,wpf,datagrid,mvvm-light,relaycommand,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, Mod

我有一个
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>
假设我在数据网格中有5项: 项目1 项目2 项目3 项目4 项目5

DataGrid
init时,
SelectedItem
为空。 然后用户右键单击
Item3
RelayCommand
fire,但
SelectedItem
仍然为空。 用户右键单击
Item1
RelayCommand
再次激发,但是,
选择editem
return
Item3
,我的代码显示错误的项目详细信息


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

IMHO,最好的方法是将样式应用于
DataGridRow
,这样可以确保命令应用于用户实际单击的项目,而忽略SelectedItem。注意以下几点:

  • DataContext现在将显示项本身,而不是集合
  • 不能在
    样式中使用
    。似乎有。或者您可以尝试切换到强大的附加命令行为:您在样式中有一个用法示例,第二个答案

为什么不在选择“编辑项更改”后应用逻辑,而不是使用触发器。@NikhilAgrawal我想在用户仅右键单击时显示信息。双击并单击将触发
SelectedItem
的设置器。在这种情况下,我可能需要在右键单击事件中使用一个标志,并在标志打开时在
SelectedItem
的setter中显示信息,然后重置标志,但我认为这不是一个好方法,或者这是一个最佳做法?我发现的另一个选项是使用
鼠标按钮ventargs
中的
VisualTreeHelper
来定位所选行,我还没有尝试过这个,因为我想找到一些没有UI元素的解决方案。供其他人参考:更新:对于我关于
SelectedItem
的第一条评论,我发现了另外一个问题,在显示信息后,用户可以右键单击该项目以再次显示信息,
SelectionChanged
事件或
SelectedItem
在选择同一项时不会被触发。@Nax感谢ans。最后,我用悬停选择启用(受ans启发)更改了
DataGrid
,它将在右键单击之前分配
SelectedItem
,缺点是,即使控制被禁用,它也会分配。。。
private void ExecResultGridMouseClickCommand()
{
    if (SelectedItem == null) return;

    DisplayInfo(SelectedItem);
}