TemplateBinding对于文本框的文本无法正常工作

9

我有一个名为EnhancedTextBox的自定义控件,它是一个包含TextBoxButton的用户控件。 我希望它对消费者来说大部分看起来像一个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 ,结果是 null。我错过了什么?我已经盯着这个问题看了一会儿,但无法弄清楚出了什么问题。我甚至认为可能是因为我使用了相同的名称,所以创建了一个名为 Text1 的属性,但并没有起作用...另外值得注意的是,如果我使用普通的 TextBox,那么这一切都能正常工作。因此,我相当确定问题出在 EnhancedTextBox 本身。

@gomi42 更新了...抱歉,我想我缩短得太多了。 - Justin Pihony
@geedubb,另外更新了...只是在将其放入SO时打错了一个字。 - Justin Pihony
@JustinPihony 没问题 - 在我看来没问题,抱歉我帮不了更多。 - geedubb
TextProperty 真的需要吗?难道不能只使用一个普通属性来绑定文本框吗? - poy
1
@Andrew 我需要它成为 DependencyProperty,这样就可以在 XAML 中使用。 - Justin Pihony
显示剩余3条评论
2个回答

26

阅读这篇 MSDN 关于 TemplateBinding 的文章后,我明白了。具体来说,

TemplateBinding 是一种优化的绑定形式,用于模板方案,类似于使用 {Binding RelativeSource={RelativeSource TemplatedParent}} 构造的绑定。

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

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

现在它正在工作。 TemplateBinding 甚至不公开这些属性...... 我还不确定为什么。


嗨,今天我也遇到了同样的问题,现在使用您的解决方案已经可以工作了,但是如果TemplateBinding Value{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}两者相似,为什么它会被接受呢?如果你已经找到答案,能否在这里分享并更新你的答案。谢谢! - Himanshu
TemplateBinding上没有UpdateSourceTrigger,因为TemplateBinding是一种向视图的单向绑定。您发布的MSDN链接指出:即使涉及的属性默认为双向绑定,TemplateBinding始终是一种单向绑定。不确定为什么它们不允许双向绑定。 - mikelt21
虽然旧了点,但我还是遇到了这个问题。请注意,您可以为自己的依赖属性设置默认绑定方式:https://dev59.com/_XE85IYBdhLWcg3wqleE 。在我的情况下,我必须使用上述绑定,其中Mode = TwoWay,并且我也将依赖属性默认绑定设置为双向。现在,绑定到文本框时,不必再指定它必须是双向的。 - Roy T.

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

1
这不是它。回调函数会被调用,但绑定的 MyText 属性仍然不会被更新。 - ANeves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接