C# WPF ListView GroupStyle GridViewHeaderRowPresenter不';不隐藏原始标题

C# WPF ListView GroupStyle GridViewHeaderRowPresenter不';不隐藏原始标题,c#,wpf,listview,C#,Wpf,Listview,我有一个使用GroupStyles的列表视图,其中columnheader显示在每个组中。这个很好用 但是,我想隐藏原始的列表视图列标题(见图片顶部),只显示组中的标题 我怎样才能将它们分开,使其只在组中显示 组样式: <Style x:Key="GroupingSerialStyle" TargetType="{x:Type GroupItem}" BasedOn="{StaticResource GroupingBase}"> <Setter Property =

我有一个使用
GroupStyles
的列表视图,其中
columnheader
显示在每个组中。这个很好用

但是,我想隐藏原始的列表视图
列标题
(见图片顶部),只显示组中的标题

我怎样才能将它们分开,使其只在组中显示

组样式:

<Style x:Key="GroupingSerialStyle" TargetType="{x:Type GroupItem}" BasedOn="{StaticResource GroupingBase}">
    <Setter Property = "Template">
        <Setter.Value>
            <ControlTemplate>
                <Expander Background="{TemplateBinding Background}"  BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" IsExpanded="{Binding IsExpandedAll, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneTime}" Margin="2">
                    <Expander.Header>
                        <StackPanel Orientation = "Horizontal">
                            <TextBlock Text=" # "/>
                            <TextBlock Text = "{Binding Name}" />
                        </StackPanel>
                    </Expander.Header>
                    <StackPanel Orientation="Vertical">
                        <GridViewHeaderRowPresenter Visibility = "Visible" Margin="15,0,0,0"
                DataContext="{Binding View, RelativeSource={RelativeSource FindAncestor,ListView,1}}"
                Columns="{Binding Columns}"       
                ColumnHeaderContainerStyle="{StaticResource GridViewColumnHeaderStyleABCD}"
                ColumnHeaderTemplate="{Binding ColumnHeaderTemplate}"
                ColumnHeaderTemplateSelector="{Binding ColumnHeaderTemplateSelector}"
                AllowsColumnReorder="{Binding AllowsColumnReorder}"
                ColumnHeaderContextMenu="{Binding ColumnHeaderContextMenu}"
                ColumnHeaderToolTip="{Binding ColumnHeaderToolTip}"
                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        <ItemsPresenter Margin = "15,0,0,0" />
                    </StackPanel>
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


编辑:此外,列标题应为每列显示自定义颜色。

可通过
ColumnHeaderContainerStyle
解决。如果您在
GridView.ColumnHeaderContainerStyle
上设置一个空的
模板
,并将样式化的
GridViewColumnHeaderStyleABCD
用于您的
组项目
,应该可以工作

我尝试了以下方法,只在具有自定义
背景的组项目中显示列标题

<ListView BindingGroup="{Binding Name}" ItemsSource="{Binding Source={StaticResource TestItems}}">
    <!-- ### custom coloring column headers ### -->
    <ListView.Resources>
        <Style TargetType="GridViewColumnHeader">
            <Setter Property="Background" Value="{Binding Path=Column.(YourNamespace:BgHelper.CustomBackground), RelativeSource={RelativeSource Self}}" />
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="GridViewColumnHeader">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                                <!-- Empty: ListViews header shows nothing -->
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GridView.ColumnHeaderContainerStyle>
            <!-- ### custom coloring column headers ### -->
            <GridViewColumn DisplayMemberBinding="{Binding Parameter0}" Header="Par0" YourNamespace:BgHelper.CustomBackground="Pink" />
            <GridViewColumn DisplayMemberBinding="{Binding Parameter1}" Header="Par1" YourNamespace:BgHelper.CustomBackground="Green" />
        </GridView>
    </ListView.View>
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <Expander Margin="2">
                        <Expander.Header>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text=" # " />
                                <TextBlock Text="{Binding Name}" />
                            </StackPanel>
                        </Expander.Header>
                        <StackPanel Orientation="Vertical">
                            <GridViewHeaderRowPresenter Margin="15,0,0,0"
                                                    Columns="{Binding Columns}"
                                                    DataContext="{Binding View, RelativeSource={RelativeSource FindAncestor, ListView, 1}}"
                                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                    Visibility="Visible" />
                            <ItemsPresenter Margin="15,0,0,0" />
                        </StackPanel>
                    </Expander>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

然后,我通过设置
CustomBackground
并在
GridViewColumnHeader
样式中使用它来扩展我上面的示例。我用注释标记了新的/编辑的行。

@WPFGermany是正确的。然而,在我最初的问题中,我忘了添加GroupStyle中的标题,我还需要为一些列标题显示不同的背景色。我可以通过复制GroupStyle中的所有列并将每个ColumnHeaderStyle指向一种独特的颜色来实现这一点。也许有更好的方法,但现在这对我来说很有效。下面是要说明的部分GroupStyle:

           <Style x:Key="GroupingNcpCheckStyleRoot" TargetType="{x:Type GroupItem}" BasedOn="{StaticResource GroupingBaseRoot}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Expander Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" IsExpanded="{Binding IsExpandedData, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneTime}" Margin="2">
                            <Expander.Header>
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox x:Name="HeaderCheckBox" Margin="0,0,6,0" IsChecked="True"></CheckBox>
                                    <TextBlock Text=" # "/>
                                    <TextBlock Text="{Binding Name}"/>
                                </StackPanel>
                            </Expander.Header>
                            <StackPanel Orientation="Vertical">
                                <GridViewHeaderRowPresenter Margin="15,0,0,0"

                                                DataContext="{Binding View, RelativeSource={RelativeSource FindAncestor, ListView, 1}}" 
                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                Visibility="Visible"   >
                                    <GridViewHeaderRowPresenter.Columns>
                                    <!--NOTE: must explicitly create the collection-->
                                    <GridViewColumnCollection>
                                            <GridViewColumn Header=" " Width="60" >
                                                <GridViewColumn.HeaderContainerStyle>
                                                    <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource GridViewColumnHeaderStyleTEST1}">
                                                        <Setter Property="Background" Value="{StaticResource TargetHeaderColor}" />
                                                        <Setter Property="Foreground" Value="White" />
                                                        <Setter Property="BorderThickness" Value="0" />
                                                        <Setter Property="Margin" Value="-1,0,-1,0" />
                                                    </Style>
                                                </GridViewColumn.HeaderContainerStyle>
                                                <GridViewColumn.CellTemplate>
                                                <DataTemplate >
                                                    <TextBlock HorizontalAlignment="Left" Text="{Binding Path=Id, StringFormat='# {0}'}"/>
                                                </DataTemplate>
                                            </GridViewColumn.CellTemplate>
                                        </GridViewColumn>

                                            <GridViewColumn Header=" Show " >
                                                <GridViewColumn.HeaderContainerStyle>
                                                    <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource GridViewColumnHeaderStyleTEST1}">
                                                        <Setter Property="Background" Value="{StaticResource DifferentHeaderColor}" />
                                                        <Setter Property="Foreground" Value="White" />
                                                        <Setter Property="BorderThickness" Value="0" />
                                                        <Setter Property="Margin" Value="-1,0,-1,0" />
                                                    </Style>
                                                </GridViewColumn.HeaderContainerStyle>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate >
                                                        <CheckBox IsChecked="{Binding Path=IncludeInReport}" HorizontalAlignment="center"></CheckBox>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>


谢谢你-我非常感谢你的建议。。你的回答确实有效——我已经证实了这一点,而且之前确实有效——你确实回答了我的问题。不幸的是,我没有提到我正在尝试根据列有条件地为标题着色。在我的图像中,您可以看到灰色,但其他一些列是橙色或蓝色,具体取决于该列。这就是它似乎破裂的地方。我试过DataTemplateSelector、ValueConverter、StyleSelector,但都没有找到可行的方法。我会继续在这里尝试…最终找到了一些可行的方法。在GroupStyle中,复制GridView中的所有列,并在其中指定可以引用不同颜色的HeaderContainerStyle。例如:谢谢你的新编辑——我让它开始工作了,它的实现比我的好得多。需要注意的是,GroupStyle应该是ContainerStyle而不是HeaderTemplate,否则记录不会折叠,只会折叠标题。再次感谢您的伟大洞察力!看看我最新的答案。而且不要再重复前面的答案了——新的编辑使它比我想到的要好得多:)
           <Style x:Key="GroupingNcpCheckStyleRoot" TargetType="{x:Type GroupItem}" BasedOn="{StaticResource GroupingBaseRoot}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Expander Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" IsExpanded="{Binding IsExpandedData, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneTime}" Margin="2">
                            <Expander.Header>
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox x:Name="HeaderCheckBox" Margin="0,0,6,0" IsChecked="True"></CheckBox>
                                    <TextBlock Text=" # "/>
                                    <TextBlock Text="{Binding Name}"/>
                                </StackPanel>
                            </Expander.Header>
                            <StackPanel Orientation="Vertical">
                                <GridViewHeaderRowPresenter Margin="15,0,0,0"

                                                DataContext="{Binding View, RelativeSource={RelativeSource FindAncestor, ListView, 1}}" 
                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                Visibility="Visible"   >
                                    <GridViewHeaderRowPresenter.Columns>
                                    <!--NOTE: must explicitly create the collection-->
                                    <GridViewColumnCollection>
                                            <GridViewColumn Header=" " Width="60" >
                                                <GridViewColumn.HeaderContainerStyle>
                                                    <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource GridViewColumnHeaderStyleTEST1}">
                                                        <Setter Property="Background" Value="{StaticResource TargetHeaderColor}" />
                                                        <Setter Property="Foreground" Value="White" />
                                                        <Setter Property="BorderThickness" Value="0" />
                                                        <Setter Property="Margin" Value="-1,0,-1,0" />
                                                    </Style>
                                                </GridViewColumn.HeaderContainerStyle>
                                                <GridViewColumn.CellTemplate>
                                                <DataTemplate >
                                                    <TextBlock HorizontalAlignment="Left" Text="{Binding Path=Id, StringFormat='# {0}'}"/>
                                                </DataTemplate>
                                            </GridViewColumn.CellTemplate>
                                        </GridViewColumn>

                                            <GridViewColumn Header=" Show " >
                                                <GridViewColumn.HeaderContainerStyle>
                                                    <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource GridViewColumnHeaderStyleTEST1}">
                                                        <Setter Property="Background" Value="{StaticResource DifferentHeaderColor}" />
                                                        <Setter Property="Foreground" Value="White" />
                                                        <Setter Property="BorderThickness" Value="0" />
                                                        <Setter Property="Margin" Value="-1,0,-1,0" />
                                                    </Style>
                                                </GridViewColumn.HeaderContainerStyle>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate >
                                                        <CheckBox IsChecked="{Binding Path=IncludeInReport}" HorizontalAlignment="center"></CheckBox>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>