C# 仅向扩展器标题添加上下文菜单

C# 仅向扩展器标题添加上下文菜单,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试组成一个数据网格(在MVVM4.5项目中),它将显示按特定属性分组的数据(通过使用扩展器)。这一切都是可行的,但我想添加一个上下文菜单,其中包含选项“全部展开”和“全部折叠”,这将折叠/展开所有组。此菜单项单击事件的事件处理程序正在窗口的代码隐藏中处理 问题是,我的上下文菜单应用于扩展器,因此由它的所有子级继承,其中包括和所有行/单元格 我只想将上下文菜单应用于分组标题本身。如果将其应用于内部(如下面示例中的StackPanel),则可以实现此功能,但在这种情况下,上下文菜单无法访问整

我正在尝试组成一个数据网格(在MVVM4.5项目中),它将显示按特定属性分组的数据(通过使用扩展器)。这一切都是可行的,但我想添加一个上下文菜单,其中包含选项“全部展开”和“全部折叠”,这将折叠/展开所有组。此菜单项单击事件的事件处理程序正在窗口的代码隐藏中处理

问题是,我的上下文菜单应用于扩展器,因此由它的所有子级继承,其中包括
和所有行/单元格

我只想将上下文菜单应用于分组标题本身。如果将其应用于内部(如下面示例中的
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祖先,而不是扩展器。当绑定到扩展器的宽度时,性能会大幅下降,这在某种程度上是有意义的,因为分组元素的数量太多了。