以前 TreeView でも似たようなことを実装したんですが、今度はDataGridでContextMenuを使いたかったので使用方法を調べました。
[WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する - Qiita
基本的には以前書いた上記のTreeViewでの場合とやりかたはほぼ同じです。
実装例
<UserControl.Resources>
<ContextMenu x:Key="SampleContextMenu">
<MenuItem Header="右クリックメニューアイテム"
Command="{Binding
Path=PlacementTarget.Tag.Command,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
CommandParameter="{Binding
Path=PlacementTarget.DataContext,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
</ContextMenu>
</UserControl.Resources>
<DataGrid ItemsSource="{Binding Path=...}">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
<Setter Property="ContextMenu" Value="{Binding Source={StaticResource SampleContextMenu}}"/>
</Style>
</DataGrid.Resources>
</DataGrid>
ContextMenu側の実装はTreeViewのときと同じで良いのでそのままです。
DataGrid側の方も、TreeViewのときの実装と同様にTagにDataGrid本体のDataContextを設定し、Resourcesに定義したContextMenuを指定しています。
TreeViewでの実装との差異は、TargetType
に DataGridRow
を指定しているところです。これでDataGridの行の上で右クリックした場合に表示されるメニューが対象になります。
捕捉
上記の例でのTargetTypeを DataGridCell
で指定している例もありましたが、セルごとのコンテキストメニューの動作切り替えは未検証です。
c# - Add context menu in datagrid, how to get the select Item value - Stack Overflow