LoginSignup
3
4

More than 5 years have passed since last update.

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

Posted at

以前 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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4