如何在WPF DataGrid中添加Column ContextMenu

时间:2009-11-04 12:58:31

标签: wpf datagrid contextmenu

我正在尝试将上下文菜单添加到WPF数据网格中的列,并且不太明白这是如何实现的。我知道如何在datagrid中添加一个,但是我希望基于列有不同的菜单项,并且菜单点击事件要知道列,或者更好的是选择上下文菜单的单元格。

我的最终目标是创建一个上下文菜单,其中包含一个“清除”菜单项,该菜单项将用于清空该列中的数据。我不希望在复选框列的情况下出现空字符串或false,我希望将基础数据排除在外。如果有人对可重复使用的方法提出建议,那么也会非常感激。

非常感谢!

2 个答案:

答案 0 :(得分:2)

另一种选择是将列标题设置为TextBlock(或其他一些可以处理ContextMenu的控件。)

所以你可以说:

// Create a context menu
var cm = new ContextMenu();
cm.Items.Add(new MenutItem{Header="SampleItem"});

// Create a textblock with your header text and link the context menu
var tb = new TextBlock{Text="My Column Name"};
tb.ContextMenu = cm;

// Set the grid column header to your textblock
grid.Columns[0].Header=tb;

答案 1 :(得分:1)

我向像这样的单元格添加一个上下文菜单

  <!--Cell ContextMenu-->
  <ContextMenu
     x:Key="cellContextMenu">
     <MenuItem
        x:Name="menuFillUp"
        Click="menuFillUp_Click"
        Header="Fill _Up" />
     <MenuItem
        x:Name="menuFillDown"
        Click="menuFillDown_Click"
        Header="Fill _Down" />
  </ContextMenu>

并将其设置为

  <!--DataCell Style - Adds ContextMenu-->
  <Style
     TargetType="{x:Type dg:DataGridCell}">
     <Setter
        Property="ContextMenu"
        Value="{DynamicResource cellContextMenu}" />
  </Style>

然后我使用以下上下文菜单

向列标题添加上下文菜单
  <!--Show Hidden Columns ContextMenu-->
  <DataTemplate
     x:Key="menuItemColumnShow">
     <MenuItem
        x:Name="menuShowColumn"
        DataContext="{Binding Path=.}"
        Header="{Binding Path=Tag.Code}"
        Click="menuShowColumn_Click" />
  </DataTemplate>

  <!--Column ContextMenu-->
  <ContextMenu
     x:Key="columnContextMenu">
     <MenuItem
        x:Name="menuHideColumn"
        Click="menuHideColumn_Click"
        Header="Hide _Column" />
     <MenuItem
        x:Name="showMenu"
        Header="Show"
        ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ResultEditorGrid}}, Path=HiddenColumnCollection}"
        ItemTemplate="{StaticResource menuItemColumnShow}">
        <MenuItem.Style>
           <Style
              BasedOn="{StaticResource {x:Type MenuItem}}"
              TargetType="{x:Type MenuItem}">
              <Style.Triggers>
                 <DataTrigger
                    Binding="{Binding RelativeSource={RelativeSource self}, Path=Items.Count}"
                    Value="0">
                    <Setter
                       Property="Visibility"
                       Value="Collapsed" />
                 </DataTrigger>
              </Style.Triggers>
           </Style>
        </MenuItem.Style>
     </MenuItem>

     <MenuItem
        Header="_Add  Item"
        Command="local:MyCommands.AddTItem"
        CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
  </ContextMenu>

      <!--ColumnManagerCell Style - Adds ContextMenu - Tool Tip Style for Marking Scheme Preview-->
  <Style
     TargetType="{x:Type dg:DataGridColumnHeader}">

     <Setter
        Property="ContextMenu"
        Value="{DynamicResource columnContextMenu}" />
  </Style>

(即时通讯使用命令和点击事件的混合,代码类型的演变:) 以上代码的作用是为列标题提供动态菜单。我在派生网格上有一个隐藏的列集合,我在列的上下文菜单中隐藏/显示shich列,我有一个单独的上下文菜单,用于网格中的单元格。

您可以找到

点击的列
 private void menuHideColumn_Click(object sender, RoutedEventArgs e) {

     //move thru the visual tree to get the context menu
     DependencyObject dep = (DependencyObject)e.OriginalSource;
     while ((dep != null) && !(dep is ContextMenu)) {
        dep = VisualTreeHelper.GetParent(dep);
     }
     if (dep == null) { }
     else {
        //we have a context menu, cast it
        ContextMenu contextMenu = (ContextMenu)dep;
        if (contextMenu.PlacementTarget is DataGridColumnHeader) {
           DataGridColumnHeader header = contextMenu.PlacementTarget as DataGridColumnHeader;
           //get the grid to hide the column
           myDerivedGrid.HideColumn(header.Column);
        }
     }
  }

我可能错过了一些事情,随时发表评论并试图填写详细信息。