XAML - 如何从 ControlTemplate 中的子项访问父控件的 DataTemplate 属性?
Posted
技术标签:
【中文标题】XAML - 如何从 ControlTemplate 中的子项访问父控件的 DataTemplate 属性?【英文标题】:XAML - How do I access a parent control's DataTemplate property from a child in a ControlTemplate? 【发布时间】:2021-12-12 23:46:15 【问题描述】:CustomUserControl.xaml.cs
public partial class CustomUserControl : UserControl
public CustomUserControl ()
InitializeComponent();
var style = (Style)FindResource("Styling");
Style = style;
public static readonly DependencyProperty ItemHeaderTemplateProperty = DependencyProperty.Register(nameof(ItemHeaderTemplate), typeof(DataTemplate), typeof(CustomUserControl), new PropertyMetadata(default(DataTemplate)));
public DataTemplate ItemHeaderTemplate
get => (DataTemplate)GetValue(ItemHeaderTemplateProperty);
set => SetValue(ItemHeaderTemplateProperty, value);
CustomUserControl.xaml
<Style x:Key="Styling" TargetType="x:Type local:CustomUserControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:CustomUserControl">
<!-- This works -->
<ContentControl ContentTemplate="TemplateBinding ItemHeaderTemplate"/>
<TabControl Name="TestName" ItemsSource="Binding Items">
<TabControl.ContentTemplate>
<DataTemplate>
<DockPanel>
<!-- These don't work -->
<ContentControl ContentTemplate="TemplateBinding ItemHeaderTemplate"/>
<ContentControl ContentTemplate="Binding ElementName=TestName, Path=DataContext.ItemHeaderTemplate"/>
<ContentControl ContentTemplate="Binding RelativeSource=RelativeSource TemplatedParent, Path=ItemHeaderTemplate"/>
</DockPanel>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在 TabControl 外部对 ItemHeaderTemplate 的引用可以正常工作,但在 TabControl 内部对 ItemHeaderTemplate 的引用都不起作用。
从 ControlTemplate 的子控件中访问父控件属性的正确方法是什么?
【问题讨论】:
【参考方案1】:我意识到我自己的问题的答案很简单。
我只需要直接设置 ContentTemplate。
<Style x:Key="Styling" TargetType="x:Type local:CustomUserControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:CustomUserControl">
<!-- This works -->
<ContentControl ContentTemplate="TemplateBinding ItemHeaderTemplate"/>
<!-- This now works too -->
<TabControl ItemsSource="Binding Items"
ContentTemplate="TemplateBinding ItemHeaderTemplate"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
以上是关于XAML - 如何从 ControlTemplate 中的子项访问父控件的 DataTemplate 属性?的主要内容,如果未能解决你的问题,请参考以下文章