Хорошо... это оставляет меня почесывать мою голову. У меня есть два элемента управления 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 я хочу связать свойство CustomFoo Text как источник внутреннего свойства UserFoo Text. Обычно это легко. Вы просто устанавливаете свойство TextFoo для текста "{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}"
Итак, что дает? Что мне не хватает?