title: In WPF, why doesn't TemplateBinding work where Binding does?
body: <p>Ok... this is leaving me scratching my head.  I have two WPF controls--one's a user control and the other's a custom control.  Let's call them UserFoo and CustomFoo.  In the control template for CustomFoo, I use an instance of UserFoo which is a named part so I can get to it after the template is applied.  That works fine.</p>
  
  <p>Now both UserFoo and CustomFoo have a <code>Text</code> property defined on them (independently, i.e. not a shared DP using AddOwner.  Don't ask...) that are both declared like this...</p>
  
  <pre><code>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
      )
  );
  </code></pre>
  
  <p>Notice specifically that the mode is set to TwoWay and the UpdateSourceTrigger is set to PropertyChanged, again for both.</p>
  
  <p>So in the style template for CustomFoo, I want to bind CustomFoo's Text property as the source to the internal UserFoo's Text property. Normally, this is easy.  You just set UserFoo's text property to "{TemplateBinding Text}" but for some reason it's only going one way (i.e. UserFoo is properly set from CustomFoo, but not the reverse), even though again, both DPs are set for two-way!  However, when using a relative source binding instead of a template binding, it works great!  Um... wha??</p>
  
  <pre><code>// 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}"
  </code></pre>
  
  <p>So what gives?  What am I missing?</p>