次のユーザー コントロールがあります。
<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 フォーラムにあります。ItemsTemplate
DisplayMemberPath
ItemsSource
Visual
これは WPF の TabControl の根本的な問題のようですので、質問を締め切らせていただきます。ご助力いただきありがとうございます!