TemplateBinding不适用于文本框文本

Jus*_*ony 5 .net c# wpf dependency-properties templatebinding

我有一个自定义控件EnhancedTextBox,它是一个具有a TextBox和a 的UserControl Button.对于消费者我希望它看起来大部分看起来像TextBox,所以我做了以下事情:

<UserControl.Template>
    <ControlTemplate TargetType="textBoxes:EnhancedTextBox">
    ...
    <TextBox Text="{TemplateBinding Text}"...
Run Code Online (Sandbox Code Playgroud)

在EnhancedTextBox我有

public static readonly DependencyProperty TextProperty =
  DependencyProperty.Register("Text", typeof (String), typeof (EnhancedTextBox));

public String Text
{
  get { return (String) GetValue(TextProperty); }
  set { SetValue(TextProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我使用它时如下:

<EnhancedTextBox Text="{Binding MyText, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}}" />
Run Code Online (Sandbox Code Playgroud)

然后,MyText永远不会更新,我检查EnhancedTextBox.Text,它是null.我错过了什么?我一直盯着这一点,无法弄清楚出了什么问题.我甚至认为可能是因为我使用的是同一个名字,所以创建一个叫做Text1无效的属性....

另外值得注意的是,如果我使用常规TextBox,那么这一切都有效.所以,我相当肯定问题在于EnhancedTextBox它自身

Jus*_*ony 17

我在阅读有关TemplateBinding的MSDN之后想出来了.特别,

TemplateBinding是模板场景的绑定的优化形式,类似于使用{Binding RelativeSource = {RelativeSource TemplatedParent}}构造的Binding.

所以,我决定明确地这样做...这将允许我设置UpdateSourceTrigger(仍然不确定它为什么不默认PropertyChanged)

<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"....
Run Code Online (Sandbox Code Playgroud)

而且,现在它正在发挥作用.TemplateBinding甚至没有曝光这些属性....再次,不知道为什么