每列边框 header

Border per column header

我想在 wpf 上创建一个 table,每个列 header 都有一个圆角,这就是我目前所得到的:

如您所见,我得到了想要的结果,但有一点不想要的结果。 不希望出现的结果是所有数据网格 header 本身(不是列)都具有相同的边框,我需要使其透明,我该怎么做?

这是样式的一部分:

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="SeparatorBrush"  Value="Transparent"/>
        <Setter Property="Margin" Value="2"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>                                        
                        <Grid>
                            <Border CornerRadius="5 5 0 0" BorderThickness="1" BorderBrush="Black">
                                <TextBlock Text="{Binding }"/>
                            </Border>
                        </Grid>                                        
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>  

出于某些原因,DataGrid 的模板中有一个空白的 DataGridColumnHeader。空白列没有 DataContext 值 (null)。因此,在 DataTrigger 中将边框刷更改为透明:

<ControlTemplate>
    <Grid>
        <Border CornerRadius="5 5 0 0" BorderThickness="1" >
            <TextBlock Text="{Binding}"/>
            <Border.Style>
                <Style TargetType="Border">
                    <Setter Property="BorderBrush" Value="Black"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding}" Value="{x:Null}">
                            <Setter Property="BorderBrush" Value="Transparent"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
</ControlTemplate>


改进版本,在 header 模板中使用 ContentPresenter 并在触发器中测试内容

<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
    <Grid>
        <Border CornerRadius="5 5 0 0" BorderThickness="1" >
            <ContentPresenter/>                                        
            <Border.Style>
                <Style TargetType="Border">
                    <Setter Property="BorderBrush" Value="Black"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" Value="{x:Null}">
                            <Setter Property="BorderBrush" Value="Transparent"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
</ControlTemplate>

header 不是必需的文本,例如:

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}">
        <DataGridTextColumn.Header>
            <Border Background="Cyan">
                <TextBlock Text="NAME" Margin="5"/>
            </Border>
        </DataGridTextColumn.Header>
    </DataGridTextColumn>
</DataGrid.Columns>