21

我尝试做这样的事情:

<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
   <DataGrid.ContextMenu>
       <ContextMenu>
          <MenuItem 
              Command="{Binding RemoveRow}" 
              CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
       </ContextMenu>
   </DataGridContextMenu>
</DataGrid>

但我总是得到空值(我也尝试过 SelectedIndex 和 SelectedValue)

如果我将以下参数传递给执行代码,它将起作用:

<MenuItem Command="{Binding RemoveRow}" CommandParameter="1">
4

2 回答 2

23

在您的 CommandParameter 中尝试类似的操作,

<DataGrid.ContextMenu>
     <ContextMenu>
           <MenuItem Header="MyHeader" 
                     Command="{Binding MyCommand}"
                     CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>

我已经对其进行了测试,它应该可以工作。

于 2013-11-28T23:00:18.987 回答
18

它不起作用,因为ContextMenu不是 的视觉或逻辑树的一部分DataGrid,因此它不继承DataContext.

据我所知,仅使用内置绑定系统就可以轻松解决此问题。但是,使用此处解释的简单“代理”类,您可以解决此问题:

<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
   <DataGrid.Resources>
       <local:BindingProxy x:Key="proxy" Data="{Binding}" />
   </DataGrid.Resources>
   <DataGrid.ContextMenu>
       <ContextMenu>
          <MenuItem 
              Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}" 
              CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
       </ContextMenu>
   </DataGridContextMenu>
</DataGrid>

但是你仍然有一个问题:ElementName=myGrid不起作用(再次,因为ContextMenu不在 的视觉或逻辑树中DataGrid,所以它不在同名范围内)。一个简单的解决方案是将 的 绑定SelectedItemDataGridViewModel 的属性,并使用该属性而不是命令参数:

<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}"
          SelectedItem="{Binding SelectedItem}">
   <DataGrid.Resources>
       <local:BindingProxy x:Key="proxy" Data="{Binding}" />
   </DataGrid.Resources>
   <DataGrid.ContextMenu>
       <ContextMenu>
          <MenuItem 
              Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}">
       </ContextMenu>
   </DataGridContextMenu>
</DataGrid>
于 2011-11-16T16:20:59.540 回答