我正在尝试将上下文菜单添加到WPF数据网格中的列,并且不太明白这是如何实现的。我知道如何在datagrid中添加一个,但是我希望基于列有不同的菜单项,并且菜单点击事件要知道列,或者更好的是选择上下文菜单的单元格。
我的最终目标是创建一个上下文菜单,其中包含一个“清除”菜单项,该菜单项将用于清空该列中的数据。我不希望在复选框列的情况下出现空字符串或false,我希望将基础数据排除在外。如果有人对可重复使用的方法提出建议,那么也会非常感激。
非常感谢!
答案 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);
}
}
}
我可能错过了一些事情,随时发表评论并试图填写详细信息。