У меня есть следующий пользовательский элемент управления:
<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
DataTemplate
. Но из-за странных взаимодействий TextBlock
в DataTemplate
связывается с родительским контейнером TabItem
, который также называется «Self», но определен в другом файле Xaml.
Вопрос
Почему привязка работает в TabItem.Header, но не из TabItem.ContentTemplate, и как мне перейти к свойствам пользовательского элемента управления из DataTemplate?
Что я уже пробовал
TemplateBinding
: Пытается привязаться к ContentPresenter в пределах TabItem
.
FindAncestor, AncestorType={x:Type TabItem}
: Не находит TabItem
родитель. Это также не работает, когда я указываю тип MyTabItem
.
ElementName=Self
: Пытается привязать элемент управления с таким именем в неверной области (родительский контейнер, а не TabItem
). Я думаю, что это дает подсказку, почему это не работает: DataTemplate создается не в том месте, где он определен в XAML, а, по-видимому, в родительском контейнере.
Полагаю, я мог бы заменить целое ControlTemplate
для достижения нужного эффекта, но, поскольку я хочу сохранить внешний вид и восприятие по умолчанию TabItem
без необходимости сохранять целое ControlTemplate
, я Я очень не хочу этого делать.
Редактировать
Тем временем я обнаружил, что проблема в том, что TabControl
s не может иметь (любой) ItemsTemplate
(включая DisplayMemberPath
), если ItemsSource
содержит Visual
s. На форуме MSDN есть ветка , объясняющая, почему .
Поскольку это похоже на фундаментальную проблему с TabFontrol в WPF, я закрываю вопрос. Спасибо за вашу помощь!