Как добавить контекстное меню правой кнопкой мыши в заголовок столбца для таблицы данных WPF 4? - PullRequest
13 голосов
/ 05 октября 2011

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

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

Ответы [ 2 ]

24 голосов
/ 05 октября 2011

Ориентация на общий стиль для всех 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 голос
/ 05 октября 2011

Это зависит от того, как вы генерируете свои столбцы, если вы определяете их в 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>
...