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
相关产品推荐
相关产品推荐

