我在单元格中添加了一个上下文菜单,如下所示:
<!--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) {
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is ContextMenu)) {
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null) { }
else {
ContextMenu contextMenu = (ContextMenu)dep;
if (contextMenu.PlacementTarget is DataGridColumnHeader) {
DataGridColumnHeader header = contextMenu.PlacementTarget as DataGridColumnHeader;
myDerivedGrid.HideColumn(header.Column);
}
}
}
我可能漏掉了一些东西,欢迎评论,我会尽力补充细节。