You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF如何在GridViewColumnHeader自定义模板中读取附加属性值

解决方案

1. 调整通用列头样式

修改ExampleListViewHeader的控件模板,通过GridViewColumnHeader.Column属性读取附加在GridViewColumn上的自定义属性:

<Style x:Key="ExampleListViewHeader" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <!-- 列标题 -->
                    <TextBlock Grid.Column="0" 
                               Text="{TemplateBinding Content}" 
                               VerticalAlignment="Bottom"/>
                    <!-- 计量单位 -->
                    <TextBlock Grid.Column="1" 
                               Text="{Binding Path=Column.(local:HeaderAttachedProperties.UofM), RelativeSource={RelativeSource TemplatedParent}}"
                               FontSize="10" 
                               VerticalAlignment="Center"/>
                    <!-- 标记 -->
                    <TextBlock Grid.Column="2" 
                               Text="{Binding Path=Column.(local:HeaderAttachedProperties.Marker), RelativeSource={RelativeSource TemplatedParent}}"
                               FontSize="10" 
                               VerticalAlignment="Center"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="FontFamily" Value="{DynamicResource PLC_Font}" />
    <Setter Property="FontSize" Value="{DynamicResource PLC_FontSize_Sub_1}" />
    <Setter Property="FontStyle" Value="Italic" />
    <Setter Property="Foreground" Value="Black" />
</Style>

2. 简化列定义

不需要再内嵌GridViewColumnHeader,直接给GridViewColumn配置属性即可,完全消除重复代码:

<GridView.Columns>
    <!-- Thing1列 复用通用样式 -->
    <GridViewColumn Width="100"
                    Header="Thing 1"
                    local:HeaderAttachedProperties.Marker="1"
                    local:HeaderAttachedProperties.UofM=" (ft) "
                    DisplayMemberBinding="{Binding Cell1}"
                    HeaderContainerStyle="{StaticResource ExampleListViewHeader}"/>
    <!-- Thing2列 复用通用样式 -->
    <GridViewColumn Width="100"
                    Header="Thing 2"
                    local:HeaderAttachedProperties.Marker="*"
                    local:HeaderAttachedProperties.UofM=" (ft) "
                    DisplayMemberBinding="{Binding Cell2}"
                    HeaderContainerStyle="{StaticResource ExampleListViewHeader}"/>
    <!-- Thing3列 复用通用样式 -->
    <GridViewColumn Header="Thing 3" 
                    DisplayMemberBinding="{Binding Cell3}" 
                    HeaderContainerStyle="{StaticResource ExampleListViewHeader}" />
</GridView.Columns>

原绑定失败原因

GridViewColumn属于逻辑树范畴,和GridViewColumnHeader不在同一条视觉树链路中,所以无法通过FindAncestor找到。而GridViewColumnHeader本身内置了Column依赖属性,直接指向它所属的GridViewColumn实例,通过该属性即可读取附加在列上的自定义属性。

内容的提问来源于stack exchange,提问作者Andy Stagg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:03