Граница для заголовка столбца

Я хочу создать таблицу на wpf, что каждый заголовок столбца имеет круглый угол, это то, что я получил до сих пор:

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

как видите, у меня есть желаемый результат с небольшим нежелательным результатом. нежелательным результатом является то, что сам заголовок всей сетки данных (не столбцы) получает одну и ту же границу, мне нужно сделать ее прозрачной, как я могу это сделать?

это часть стиля:

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

1 ответ

Решение

По некоторым причинам 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>


улучшенная версия, которая использует ContentPresenter в шаблоне заголовка и тестирует Content в триггере

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

В заголовке не обязательно текст, например:

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}">
        <DataGridTextColumn.Header>
            <Border Background="Cyan">
                <TextBlock Text="NAME" Margin="5"/>
            </Border>
        </DataGridTextColumn.Header>
    </DataGridTextColumn>
</DataGrid.Columns>
Другие вопросы по тегам