我有以下用户控制:
<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,则TabControls 不能有(任何)ItemsTemplate(包括) 。MSDN 论坛上有一个帖子解释了原因。DisplayMemberPathItemsSourceVisual
由于这似乎是 WPF 的 TabControl 的一个基本问题,所以我要结束这个问题。感谢你的帮助!