わかりました...これで頭をかいてしまいます。2つのWPFコントロールがあります。1つはユーザーコントロールで、もう1つはカスタムコントロールです。それらをUserFooとCustomFooと呼びましょう。CustomFooのコントロールテンプレートでは、名前付きパーツであるUserFooのインスタンスを使用して、テンプレートの適用後にアクセスできるようにします。それはうまくいきます。
これで、UserFooとCustomFooの両方に、Text
このように宣言されたプロパティが定義されます(独立して、つまり、AddOwnerを使用する共有DPではありません。質問しないでください...)。
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(UserFoo), // The other is CustomFoo
new FrameworkPropertyMetadata(
null,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
null,
null,
true,
UpdateSourceTrigger.PropertyChanged
)
);
特に、モードがTwoWayに設定され、UpdateSourceTriggerがPropertyChangedに設定されていることに注意してください。
そのため、CustomFooのスタイルテンプレートで、CustomFooのTextプロパティをソースとして内部のUserFooのTextプロパティにバインドしたいと思います。通常、これは簡単です。UserFooのtextプロパティを"{TemplateBindingText}"に設定しただけですが、何らかの理由で一方向にしか進まない(つまり、UserFooはCustomFooから適切に設定されていますが、逆ではありません)。ただし、両方のDPが双方向に設定されています。ただし、テンプレートバインディングの代わりに相対ソースバインディングを使用する場合は、うまく機能します。えっと…なに?
// This one works
Text="{Binding Text, RelativeSource={RelativeSource AncestorType={local:CustomFoo}}, Mode=TwoWay}"
// As does this too...
Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
// But not this one!
Text="{TemplateBinding Text}"
では、何が得られるのでしょうか?私は何が欠けていますか?