【问题标题】:Border per column header每列标题的边框
【发布时间】:2016-12-07 22:25:07
【问题描述】:

我想在 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>  

【问题讨论】:

    标签: wpf datagrid wpfdatagrid wpf-style


    【解决方案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>
    

    header 不一定是文本,例如:

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

    【讨论】:

    • 谢谢,这正是我需要的,非常感谢
    • 嗨,当我使用 并添加 datacontext 时,它会显示数据网格中对象的类,我该如何删除它?例如,如果我的类是 ViewModel 而不是在数据网格中,它会向我显示所有列的标题和名为 ViewModel 的另一列,并且该列位于其他列之上
    • @Joe,确实,我没有使用 DataContext 进行测试,只设置了 ItemsSource;使用 dataContext 它不能按预期工作。查看改进版
    • 谢谢,我会试着理解RelativeSource={RelativeSource TemplatedParent}} 的意思
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多