XAML - 如何从 ControlTemplate 中的子控件访问父控件的 DataTemplate 属性?
XAML - How do I access a parent control's DataTemplate property from a child in a ControlTemplate?
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 的引用工作 none。
从 ControlTemplate 的子控件中访问父控件的 属性 的正确方法是什么?
我意识到我自己的问题的答案非常简单。
我只需要直接设置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>
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 的引用工作 none。
从 ControlTemplate 的子控件中访问父控件的 属性 的正确方法是什么?
我意识到我自己的问题的答案非常简单。
我只需要直接设置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>