Хорошо ... это заставляет меня чесать голову. У меня есть два элемента управления WPF - один пользовательский элемент управления, а другой пользовательский элемент управления. Давайте назовем их UserFoo и CustomFoo. В шаблоне элемента управления для CustomFoo я использую экземпляр UserFoo, который является именованной частью, чтобы я мог добраться до него после применения шаблона. Это отлично работает.
Теперь и для UserFoo, и для CustomFoo определено свойство Text
(независимо, т. Е. Не общий DP, использующий AddOwner. Не спрашивайте ...), которые оба объявлены следующим образом ...
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 я хочу связать свойство Text CustomFoo как источник с внутренним свойством Text UserFoo. Обычно это легко. Вы просто устанавливаете текстовое свойство UserFoo на "{TemplateBinding Text}", но по какой-то причине оно идет только в одну сторону (т.е. 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}"
Так что дает? Чего мне не хватает?