Он не работает, потому что 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>