如何从ContentTemplate绑定到周围的自定义控件?

Dav*_*itt 6 wpf xaml binding datatemplate

我有以下用户控件:

<TabItem 
    x:Name="Self"
    x:Class="App.MyTabItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:app="clr-namespace:App"
    >
    <TabItem.Header>
        <!-- This works -->
        <TextBlock Text="{Binding ElementName=Self, Path=ShortLabel, UpdateSourceTrigger=PropertyChanged}"/>
    </TabItem.Header>
    <TabItem.ContentTemplate>
        <DataTemplate>
            <!-- This binds to "Self" in the surrounding window's namespace -->
            <TextBlock Text="{Binding ElementName=Self, Path=ShortLabel, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)

这个自定义TabItem定义了一个DependencyProperty'ShortLabel'来实现一个接口.我想结合这一点,从内的其他性质TabItemDataTemplate.但由于奇怪的相互作用,在TextBlock内部DataTemplate被绑定到父容器TabItem,这也被称为"自我",但在另一个XAML文件中定义.

为什么Binding在TabItem.Header中工作,而不是在TabItem.ContentTemplate中工作,我应该如何从DataTemplate中获取用户控件的属性?

我已经尝试过了什么

  • TemplateBinding:尝试绑定到内容的内容中的ContentPresenter TabItem.
  • FindAncestor, AncestorType={x:Type TabItem}:找不到TabItem父母.当我指定MyTabItem类型时,这也不起作用.
  • ElementName=Self:尝试绑定到具有该名称的控件在错误的范围内(父容器,而不是TabItem).我认为这给出了一个提示,为什么这不起作用:DataTemplate不是在XAML中定义的位置创建的,但显然是由父容器创建的.

我假设我可以替换整体ControlTemplate来实现我正在寻找的效果,但由于我想保留默认的外观和感觉TabItem而不必保持整体ControlTemplate,我非常不愿意这样做.

编辑

同时我发现问题是:如果包含s ,则TabControls不能包含(任何)ItemsTemplate(包括DisplayMemberPath).MSDN论坛上一个解释原因的帖子.ItemsSourceVisual

由于这似乎是WPF的TabControl的一个基本问题,我正在关闭这个问题.感谢你的帮助!

Bob*_*ing 1

尝试这个。我不确定它是否会起作用,但是

<TabItem 
    x:Name="Self"
    x:Class="App.MyTabItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:app="clr-namespace:App"
    >
    <TabItem.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=ShortLabel}"/>
        </DataTemplate>
    </TabItem.ContentTemplate>
</TabItem>
Run Code Online (Sandbox Code Playgroud)

如果不起作用,请尝试将此属性粘贴到 <TabItem/> 中:

DataContext="{Binding RelativeSource={RelativeSource self}}"
Run Code Online (Sandbox Code Playgroud)