Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a right click context menu to Column Header for a WPF 4 DataGrid?

I want the context menu for a DataGrid's column headers to be different than the rest of the cells. So using the regular ContextMenu property is not going to work. There is DataGrid.RowHeaderTemplate, but I can't find DataGrid.ColumnHeaderTemplate.

Edit/Note: Columns are generated dynamically.

like image 994
Joe Avatar asked Oct 04 '11 22:10

Joe


2 Answers

Target a common Style to all DataGridColumnHeaders:

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

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

If you want different context menus for different column headers then use triggers:

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

Hope that helps.

like image 103
WPF-it Avatar answered Oct 23 '22 13:10

WPF-it


It depends on how you are generating your columns, if you are defining them in XAML then you could do this:

<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>
like image 35
Grokodile Avatar answered Oct 23 '22 13:10

Grokodile