如何为WPF 4 DataGrid的列标题添加右键单击上下文菜单?

时间:2011-10-04 22:55:03

标签: wpf wpfdatagrid

我希望DataGrid列标题的上下文菜单与其他单元格不同。因此,使用常规ContextMenu属性是行不通的。有DataGrid.RowHeaderTemplate,但我找不到DataGrid.ColumnHeaderTemplate。

编辑/注意:列是动态生成的。

2 个答案:

答案 0 :(得分:23)

将所有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>

希望有所帮助。

答案 1 :(得分:1)

这取决于您如何生成列,如果您在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>