我有以下用户控制:
<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}"/>
这个自定义的 TabItem 定义了一个DependencyProperty
“ShortLabel”来实现一个接口。我想从TabItem
's中绑定到 this 和其他属性DataTemplate
。但是由于奇怪的交互,其中TextBlock
的DataTemplate
被绑定到 的父容器,该容器TabItem
也称为“Self”,但在另一个 Xaml 文件中定义。
问题
为什么绑定在 TabItem.Header 中起作用,但在 TabItem.ContentTemplate 中不起作用,我应该如何继续从 DataTemplate 中获取用户控件的属性?
我已经尝试过的
TemplateBinding
: 尝试在TabItem
.FindAncestor, AncestorType={x:Type TabItem}
: 找不到TabItem
父母。MyTabItem
当我指定类型时,这也不起作用。ElementName=Self
: 尝试绑定到错误范围内具有该名称的控件(父容器,而不是TabItem
)。我认为这给出了一个提示,为什么这不起作用:DataTemplate 不是在 XAML 中定义的位置创建的,而是显然是由父容器创建的。
我假设我可以替换整个ControlTemplate
来实现我正在寻找的效果,但是由于我想保留默认外观TabItem
而不必维护整体ControlTemplate
,所以我非常不愿意这样做。
编辑
同时我发现问题是:如果包含s,则TabControl
s 不能有(任何)ItemsTemplate
(包括) 。MSDN 论坛上有一个帖子解释了原因。DisplayMemberPath
ItemsSource
Visual
由于这似乎是 WPF 的 TabControl 的一个基本问题,所以我要结束这个问题。感谢你的帮助!