C# 仅向扩展器标题添加上下文菜单
我正在尝试组成一个数据网格(在MVVM4.5项目中),它将显示按特定属性分组的数据(通过使用扩展器)。这一切都是可行的,但我想添加一个上下文菜单,其中包含选项“全部展开”和“全部折叠”,这将折叠/展开所有组。此菜单项单击事件的事件处理程序正在窗口的代码隐藏中处理 问题是,我的上下文菜单应用于扩展器,因此由它的所有子级继承,其中包括C# 仅向扩展器标题添加上下文菜单,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试组成一个数据网格(在MVVM4.5项目中),它将显示按特定属性分组的数据(通过使用扩展器)。这一切都是可行的,但我想添加一个上下文菜单,其中包含选项“全部展开”和“全部折叠”,这将折叠/展开所有组。此菜单项单击事件的事件处理程序正在窗口的代码隐藏中处理 问题是,我的上下文菜单应用于扩展器,因此由它的所有子级继承,其中包括和所有行/单元格 我只想将上下文菜单应用于分组标题本身。如果将其应用于内部(如下面示例中的StackPanel),则可以实现此功能,但在这种情况下,上下文菜单无法访问整
和所有行/单元格
我只想将上下文菜单应用于分组标题本身。如果将其应用于内部(如下面示例中的StackPanel
),则可以实现此功能,但在这种情况下,上下文菜单无法访问整个标题行,只能访问StackPanel
内容/文本
我计划对项目本身使用不同的上下文菜单(添加/编辑等),并将折叠/扩展上下文菜单仅应用于组标题。这是可以实现的吗
<DataGrid Name="dgData" ItemsSource="{Binding MyItems}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.Resources>
<!--GroupHeader Text-->
<Style x:Key="gridGroupTextStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
<!--GroupHeader ContextMenu-->
<ContextMenu x:Key="cm_columnHeaderMenu">
<MenuItem Name="mi_ExpandAll" Header="Expand groups"/>
<MenuItem Name="mi_CollapseAll" Header="Collapse groups"/>
</ContextMenu>
<!--Grouping style-->
<Style x:Key="filesGroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp" IsExpanded="true">
<Expander.Style>
<Style TargetType="{x:Type Expander}">
<Setter Property="ContextMenu" Value="{StaticResource cm_columnHeaderMenu}"/>
</Style>
</Expander.Style>
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Style="{StaticResource gridGroupTextStyle}"/>
<TextBlock Text=" (" Style="{StaticResource gridGroupTextStyle}"/>
<TextBlock Text="{Binding ItemCount}" Style="{StaticResource gridGroupTextStyle}"/>
<TextBlock Text=")" Style="{StaticResource gridGroupTextStyle}"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource filesGroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" Binding="{Binding Prop1}" IsReadOnly="True"/>
<DataGridTextColumn Header="Column 2" Binding="{Binding Prop2}" IsReadOnly="True"/>
<DataGridTextColumn Header="Column 3" Binding="{Binding Prop3}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
如果我理解正确,您希望单击
堆栈面板中的任意位置
,并使上下文菜单
如下所示:
如果是,则在这里输入代码:
<Expander Grid.Row="1">
<Expander.Style>
<Style TargetType="{x:Type Expander}">
<Setter Property="ContextMenu" Value="{x:Null}"/>
</Style>
</Expander.Style>
<Expander.Header>
<StackPanel Orientation="Horizontal" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}}" Background="Pink" HorizontalAlignment="Stretch">
<StackPanel.Style>
<Style TargetType="StackPanel" >
<Setter Property="ContextMenu" Value="{StaticResource cm_columnHeaderMenu}"></Setter>
</Style>
</StackPanel.Style>
<TextBlock Text="Hello" />
<TextBlock Text=" (" />
<TextBlock Text="world" />
<TextBlock Text=")" />
<TextBlock Text="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}}" />
</StackPanel>
</Expander.Header>
<TextBlock Text="Dummy"></TextBlock>
</Expander>
我做了什么
- 首先,将Stackpanel宽度绑定到扩展器的实际宽度
- 第二,使Stackpanel伸展
希望这有帮助等一下。。。你能找到祖先吗?!我很惊讶:D多年来一直试图做这样的事情!请注意这个解决方案:我将数据绑定宽度设置为DataGrid祖先,而不是扩展器。当绑定到扩展器的宽度时,性能会大幅下降,这在某种程度上是有意义的,因为分组元素的数量太多了。