WPF ListView GroupStyle GridViewHeaderRowPresenter не скрывает исходные заголовки

#c# #wpf #listview

#c# #wpf #listview

Вопрос:

введите описание изображения здесь

У меня есть listview, который использует GroupStyles , где ColumnHeaders отображаются в каждой группе. Это работает нормально.

Однако я хотел бы скрыть исходный ListView 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>
  

Редактировать: далее заголовки столбцов должны быть представлены пользовательскими цветами для каждого столбца.

Ответ №1:

Это можно решить с помощью ColumnHeaderContainerStyle . Если вы установите пустой Template at GridView.ColumnHeaderContainerStyle и используете свой стиль GridViewColumnHeaderStyleABCD для своего GroupItem , он должен работать.

Я попробовал следующее, которое отображает только заголовки столбцов в элементах группы с настраиваемыми Background .

 <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>
  

Чтобы настроить цвета заголовка столбца, вы можете использовать AttachedProperty следующее:

 namespace YourNamespace
{
    public class BgHelper
    {
        #region Fields

        public static DependencyProperty CustomBackgroundProperty =
            DependencyProperty.RegisterAttached("CustomBackground",
                                                typeof (SolidColorBrush),
                                                typeof (BgHelper),
                                                new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Transparent)));

        #endregion

        #region Public Methods

        public static SolidColorBrush GetCustomBackground(DependencyObject element)
        {
            return (SolidColorBrush) element.GetValue(CustomBackgroundProperty);
        }

        public static void SetCustomBackground(DependencyObject element, SolidColorBrush value)
        {
            element.SetValue(CustomBackgroundProperty, value);
        }

        #endregion
    }
}
  

Затем я расширил свой приведенный выше пример, установив CustomBackground и используя его в GridViewColumnHeader стиле. Я пометил новые / отредактированные строки комментариями.

Комментарии:

1. Спасибо — я действительно ценю предложение.. Ваш ответ действительно работает — я подтвердил это, и на самом деле это работало ранее — вы ответили на то, что я спросил. К сожалению, я не упомянул, что я пытаюсь условно раскрасить заголовки в зависимости от столбца. На моем изображении вы видите серый цвет, но некоторые другие столбцы оранжевые или синие в зависимости от столбца. Вот где это, кажется, ломается. Я пробовал DataTemplateSelector, ValueConverter, style selector, но не смог получить что-то работоспособное. Я продолжу пробовать здесь…

2. Наконец-то нашел что-то, что будет работать. В GroupStyle продублируйте все столбцы из GridView и укажите там HeaderContainerStyle, который может ссылаться на разные цвета. Например.:

3. спасибо за новые правки — я заставил это работать, и это гораздо лучшая реализация, чем та, что у меня была. Небольшое замечание о том, что GroupStyle должен быть ContainerStyle, а не HeaderTemplate, иначе записи не будут свернуты — только заголовки. Еще раз спасибо за отличную информацию!

Ответ №2:

@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>
  

Комментарии:

1. взгляните на мой обновленный ответ. И не забудьте проголосовать

2. Обратитесь к предыдущему ответу — новые изменения делают его намного лучше, чем то, что я придумал 🙂