如何在WPF DataGrid中添加列右键菜单

3
我正在尝试为WPF数据网格中的一列添加上下文菜单,但不太清楚如何实现。我知道如何将其添加到数据网格中,但我想根据列添加不同的菜单项,并使菜单单击事件知道所选列或更好的是所选单元格。
我的最终目标是创建一个上下文菜单,其中包含一个“清除”菜单项,用于将该列中的数据设置为空值。我不希望在复选框列的情况下出现空字符串或false,而是要将底层数据设置为空值。如果有人有关于可重用方法的建议,那将不胜感激。
非常感谢!
2个回答

2
另一种选择是将列标题设置为(或其他可以处理的控件)。 因此,您可以这样说:
// 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
我在单元格中添加了一个上下文菜单,如下所示:
  <!--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>

(我使用了一种奇怪的命令和点击事件的混合,代码有点演变了 :) 上面的代码给我提供了动态菜单在列标题上。我在我的派生网格上有一个隐藏的列集合,并在列上显示哪些列被隐藏/显示在上下文菜单中,我还有一个单独的上下文菜单用于网格中的单元格。

您可以通过以下方式找到单击的列

 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);
        }
     }
  }

我可能漏掉了一些东西,欢迎评论,我会尽力补充细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接