它不起作用,因为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
,所以它不在同名范围内)。一个简单的解决方案是将 的 绑定SelectedItem
到DataGrid
ViewModel 的属性,并使用该属性而不是命令参数:
<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>