DataGridColumnHeader同时设置ContentTemplateSelector与Template后Selector失效问题
我刚踩过这个坑!问题出在你自定义的ControlTemplate里——缺少了负责渲染内容并应用模板选择器的ContentPresenter控件。
默认的DataGridColumnHeader模板中自带了ContentPresenter,它会自动关联ContentTemplateSelector属性,帮你调用对应的选择器逻辑。但你自己写的模板里只放了左右两个Thumb,完全没有处理内容渲染的部分,WPF自然找不到触发StringDataTemplateSelector的入口。而Button的默认模板本身就包含ContentPresenter,所以同时设置Template和ContentTemplateSelector不会有问题,这就是两者的区别。
修复方案:在自定义模板中添加ContentPresenter
修改你的ControlTemplate,加入ContentPresenter并绑定必要的属性,让它关联到DataGridColumnHeader的Content、ContentTemplateSelector等属性上:
<Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}"> <Setter Property="ContentTemplateSelector" Value="{StaticResource StringDataTemplateSelector}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> <Grid> <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" /> <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" /> <!-- 新增ContentPresenter,绑定关键属性 --> <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
为什么这样有效?
ContentPresenter是WPF中负责呈现内容的核心控件,它会根据绑定的ContentTemplateSelector自动调用选择器的SelectTemplate方法,从而触发你设置的断点。通过TemplateBinding,我们把它和DataGridColumnHeader自身的属性关联起来,保证模板选择器的逻辑能正常执行。
替换完模板后,运行你的代码,StringDataTemplateSelector里的Debugger.Break()就会正常触发了。
内容的提问来源于stack exchange,提问作者Sheridan

