Почему в WPF TemplateBinding не работает там, где работает Binding?

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

И что из этого получается? Что мне не хватает?

41
задан MarqueIV 12 August 2017 в 22:04
поделиться