次のユーザー コントロールがあります。
<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バインドされます。これは "Self" とも呼ばれますが、別の Xaml ファイルで定義されています。TabItem
質問
TabItem.Header ではバインディングが機能するのに、TabItem.ContentTemplate 内では機能しないのはなぜですか? また、DataTemplate 内からユーザー コントロールのプロパティにアクセスするにはどうすればよいですか?
私がすでに試したこと
TemplateBinding: の内部で ContentPresenter にバインドしようとしTabItemます。FindAncestor, AncestorType={x:Type TabItem}TabItem:親が見つかりません。タイプを指定すると、これも機能しませんMyTabItem。ElementName=Self: 間違ったスコープ (親コンテナーではなく) でその名前のコントロールにバインドしようとしTabItemます。なぜこれが機能しないのか、ヒントが得られると思います.DataTemplateは、XAMLで定義された時点では作成されませんが、明らかに親コンテナーによって作成されます。
ControlTemplate探している効果を達成するために全体を置き換えることができると思いますTabItemが、全体を維持することなくのデフォルトのルック アンド フィールを維持ControlTemplateしたいので、そうするのは非常に気が進まないのです。
編集
一方、問題は次TabControlのとおりであることがわかりました。理由を説明するスレッドが MSDN フォーラムにあります。ItemsTemplateDisplayMemberPathItemsSourceVisual
これは WPF の TabControl の根本的な問題のようですので、質問を締め切らせていただきます。ご助力いただきありがとうございます!