TemplateBinding不适用于文本框文本

时间:2014-01-09 20:35:21

标签: c# .net wpf dependency-properties templatebinding

我有一个名为EnhancedTextBox的自定义控件,它是一个具有TextBoxButton的UserControl。对于消费者我希望它看起来像TextBox,所以我做了以下几点:

<UserControl.Template>
    <ControlTemplate TargetType="textBoxes:EnhancedTextBox">
    ...
    <TextBox Text="{TemplateBinding Text}"...

在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); }
}

然而,当我将它用作以下内容时:

<EnhancedTextBox Text="{Binding MyText, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}}" />

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

另外值得注意的是,如果我使用常规TextBox,那么这一切都有效。所以,我很确定问题出在EnhancedTextBox本身

2 个答案:

答案 0 :(得分:14)

我在阅读this MSDN about TemplateBinding后想出来了。具体地,

  

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

所以,我决定明确这样做......这样我就可以设置UpdateSourceTrigger(仍然不确定为什么它不会默认为PropertyChanged

<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"....

现在它正在发挥作用。 TemplateBinding甚至没有公开这些属性....再次,不知道为什么

答案 1 :(得分:-1)

当您注册该物业时,您错过了回传。

以下是示例代码。

    public bool IsSelected
    {
        get { return (bool)GetValue(IsSelectedProperty); }
        set { SetValue(IsSelectedProperty, value); }
    }

    public void IsSelectedChangedCallback()
    {

        //actions when property changed

    }

    private static void OnSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        userControl.IsSelectedChangedCallback();
    }

    public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(MyUserControl), new PropertyMetadata(new PropertyChangedCallback(OnSelectedChanged)));