Search code examples
wpfxamlwpfdatagrid

How to draw a separator line below DataGrid headers in WPF


Is there a way to draw a separator line below the headers in a DataGrid? I have set GridLinesVisibility to None as I don't want any gridlines except the one below the headers. I'm struggling to find a way to do this and any help would be greatly appreciated.

This is what I want to achieve.

enter image description here


Solution

  • You can modify the DataGridColumnHeader's ControlTemplate.

    I used the original DataGrid's template and replaced the default border and fill with a Rectangle with a height of 1.

    <DataGrid>
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="DataGridColumnHeader">
                <Style.Resources>
    
                    <!-- This style is required for the column resize thumbs -->
                    <Style x:Key="ColumnHeaderGripperStyle" TargetType="{x:Type Thumb}">
                        <Setter Property="Width" Value="8" />
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Cursor" Value="SizeWE" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type Thumb}">
                                    <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Style.Resources>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                            <Grid Background="White">
                                <Grid.RowDefinitions>
                                    <RowDefinition/>
                                    <RowDefinition Height="1"/>
                                </Grid.RowDefinitions>
                                <ContentPresenter Grid.Row="0" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
    
                                <Thumb Grid.Row="0" x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" />
                                <Thumb Grid.Row="0" x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" />
    
                                <Rectangle Grid.Row="1" Height="1" HorizontalAlignment="Stretch" Stroke="Black"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.ColumnHeaderStyle>
    </DataGrid>