[WPF][MVVM] DataGridの右クリックメニューからViewModelのCommandを実行する

  • 2
    いいね
  • 0
    コメント

以前 TreeView でも似たようなことを実装したんですが、今度はDataGridでContextMenuを使いたかったので使用方法を調べました。

[WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する - Qiita

基本的には以前書いた上記のTreeViewでの場合とやりかたはほぼ同じです。

実装例

ContextMenu側XAML
<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>
Data側XAML(DataGridRowを指定)
<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での実装との差異は、TargetTypeDataGridRow を指定しているところです。これでDataGridの行の上で右クリックした場合に表示されるメニューが対象になります。

捕捉

上記の例でのTargetTypeを DataGridCell で指定している例もありましたが、セルごとのコンテキストメニューの動作切り替えは未検証です。

c# - Add context menu in datagrid, how to get the select Item value - Stack Overflow