セルで満たされていない DataGrid 領域にアクセスするにはどうすればよいですか?
このエリアだけコンテキストメニューを追加したい
「空白」領域の DataGrid 自体に ContextMenu を割り当てることができますが、行 (または「DataGrid. RowStyle" プロパティ)。
「回避策」は、具体的には、別のコンテキスト メニューを行に割り当てることです。
<DataGrid>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Menu Item in Blank Area" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Menu Item just for Populated Rows" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowStyle>
</DataGrid>
前の回答へのコメントに基づいて、ヘッダーに 1 つの ContextMenu を設定し、セルと空のスペースに別の ContextMenu を設定したいことがわかりました。Template をオーバーライドすることで、個別の ContextMenus を設定できました。
<Window x:Class="Apc_System_Generator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<ResourceDictionary>
<ContextMenu x:Key="cmenu">
<MenuItem Header="FOO" />
<MenuItem Header="BAR" />
</ContextMenu>
<ContextMenu x:Key="omenu">
<MenuItem Header="LOL" />
<MenuItem Header="WUT" />
</ContextMenu>
</ResourceDictionary>
</Grid.Resources>
<DataGrid Name="LOL" AutoGenerateColumns="True" ContextMenu="{StaticResource cmenu}">
<DataGrid.Template>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DataGridColumnHeadersPresenter Grid.Row="0" ContextMenu="{StaticResource omenu}" />
<DataGridRowsPresenter Background="gray" Grid.Row="1" IsItemsHost="True" />
</Grid>
</ControlTemplate>
</DataGrid.Template>
</DataGrid>
</Grid>
</Window>