如何在WPF数据网格中添加列上下文菜单
我正在尝试向WPF datagrid中的列添加上下文菜单,但不太明白这是如何实现的。我知道如何向datagrid中添加一个,但我希望根据列设置不同的菜单项,同时让菜单单击事件知道列,或者更好的是,知道选择上下文菜单的单元格 我的最终目标是创建一个上下文菜单,它有一个“Clear”菜单项,用于清空该列中的数据。对于复选框列,我不希望出现空字符串或false,我希望底层数据为null。如果有人对可重复使用的方法提出建议,我们也将不胜感激如何在WPF数据网格中添加列上下文菜单,wpf,datagrid,contextmenu,Wpf,Datagrid,Contextmenu,我正在尝试向WPF datagrid中的列添加上下文菜单,但不太明白这是如何实现的。我知道如何向datagrid中添加一个,但我希望根据列设置不同的菜单项,同时让菜单单击事件知道列,或者更好的是,知道选择上下文菜单的单元格 我的最终目标是创建一个上下文菜单,它有一个“Clear”菜单项,用于清空该列中的数据。对于复选框列,我不希望出现空字符串或false,我希望底层数据为null。如果有人对可重复使用的方法提出建议,我们也将不胜感激 多谢 我向单元格添加了一个上下文菜单,如下所示 <!
多谢 我向单元格添加了一个上下文菜单,如下所示
<!--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>
我可能错过了一些东西,请随意发表评论,我会尝试填写详细信息。另一个选项是将列标题设置为
文本块(或可以处理上下文菜单的其他控件)
所以你可以说:
// 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;
<!--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);
}
}
}
// 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;