XAML如何在ControlTemplate内的子控件中访问父控件的DataTemplate属性
绑定失效原因
TemplateBinding仅可在ControlTemplate的直接作用域内使用,嵌套在TabControl.ContentTemplate(属于数据模板)内部时,当前上下文的模板父级已变为TabItem,不再是外层的CustomUserControl- 按
ElementName绑定无法生效是因为DataTemplate拥有独立的名称作用域,无法检索到外层控制模板内的元素 - 直接使用
RelativeSource={RelativeSource TemplatedParent}同样因为上下文变化,命中的是TabItem的模板父级,无法关联到自定义控件的属性
正确绑定方式
使用 RelativeSource 向上查找指定类型的祖先控件即可,不需要依赖名称作用域或当前模板上下文:
<ContentControl ContentTemplate="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:CustomUserControl}}, Path=ItemHeaderTemplate}"/>
如果内部有多处需要用到该属性,也可以提前在 TabControl 层级绑定一次属性到自身Tag上,减少内部多次查找祖先的开销:
<TabControl Name="TestName" ItemsSource="{Binding Items}" Tag="{Binding ItemHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}"> <TabControl.ContentTemplate> <DataTemplate> <DockPanel> <ContentControl ContentTemplate="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}}"/> </DockPanel> </DataTemplate> </TabControl.ContentTemplate> </TabControl>
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

