Подтвердить что ты не робот

Как добавить контекстное меню правой кнопки мыши в заголовок столбца для DataGrid WPF 4?

Я хочу, чтобы контекстное меню для заголовков столбцов DataGrid отличалось от остальных ячеек. Поэтому использование обычного свойства ContextMenu не будет работать. Существует DataGrid.RowHeaderTemplate, но я не могу найти DataGrid.ColumnHeaderTemplate.

Редактировать/Примечание: столбцы генерируются динамически.

4b9b3361

Ответ 1

Настроить общий стиль для всех DataGridColumnHeaders:

    <DataGrid.Resources>
         <ContextMenu x:Key="DataGridColumnHeaderContextMenu" ...>
         </ContextMenu>

         <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu"
                    Value="{StaticResource DataGridColumnHeaderContextMenu}" />
         </Style>
   </DataGrid.Resources>

Если вы хотите использовать различные контекстные меню для разных заголовков столбцов, используйте триггеры:

     <DataGrid.Resources>
         <ContextMenu x:Key="ColumnHeaderContextMenu1" ...>
         </ContextMenu>

         <ContextMenu x:Key="ColumnHeaderContextMenu2" ...>
         </ContextMenu>

         <Style TargetType="{x:Type DataGridColumnHeader}">
             <Style.Triggers>
                <Trigger Property="Content" Value="Column1">
                    <Setter Property="ContextMenu"
                            Value="{StaticResource ColumnHeaderContextMenu1}" />
                </Trigger>
                <Trigger Property="Content" Value="Column2">
                    <Setter Property="ContextMenu"
                            Value="{StaticResource ColumnHeaderContextMenu2}" />
                </Trigger>
             </Style.Triggers>
        </Style>
   </DataGrid.Resources>

Надеюсь, что это поможет.

Ответ 2

Это зависит от того, как вы генерируете свои столбцы, если вы определяете их в XAML, тогда вы можете сделать это:

<DataGrid DataContext="{Binding MyDataContext}" ItemsSource="{Binding MyItems}" AutoGenerateColumns="False">        
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age" >
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{TemplateBinding Content}" >
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Task _1" />
                                <MenuItem Header="Task _2" />
                                <MenuItem Header="Task _3" />
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>