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 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XAML 引用嵌入式资源?

使用 C# 如何从 xaml 返回切换开关的值

如何从页面中的 App.xaml 获取颜色值

如何从 xaml 访问 UserControl 内的按钮?

WPF 中.XAML文件如何读取资源文件?

如何从 Expression Design 导出到 Silverlight XAML 并保留向量相关性?