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

后端 未结 2 1450
半阙折子戏
半阙折子戏 2020-12-15 22:26

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

相关标签:
2条回答
  • 2020-12-15 23:08

    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.

    0 讨论(0)
  • 2020-12-15 23:18

    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>
    
    0 讨论(0)
提交回复
热议问题