【问题标题】:TemplateBinding not working for textbox textTemplateBinding 不适用于文本框文本
【发布时间】:2014-01-28 14:45:00
【问题描述】:

我有一个名为EnhancedTextBox 的自定义控件,它是一个具有TextBox 和Button 的UserControl。对于消费者来说,我希望它看起来像一个文本框,所以我做了以下操作:

<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 本身

【问题讨论】:

  • 你试过&lt;EnhancedTextBox Text={Binding MyText, Mode=TwoWay} /&gt;吗?
  • @gomi42 更新了...抱歉我想我缩短了太多
  • @gomi42 我相信TextBox 无论如何默认为 2way 绑定
  • @geedubb 另外,更新了...只是将其放入 SO 中的一个错字
  • @Andrew 我需要它是一个 DependencyProperty 以便它可以在 XAML 中使用

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


【解决方案1】:

我在阅读this MSDN about TemplateBinding 后发现了这一点。具体来说,

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

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

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

而且,现在它正在工作。 TemplateBinding 甚至没有公开这些属性....再说一次,不知道为什么

【讨论】:

  • 嘿,今天我也遇到了同样的问题,它现在正在使用您的解决方案,但如果 TemplateBinding Value 和 {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value} 都是类似的,那么为什么它会接受!如果到目前为止您已经弄清楚并回答了,那么您可以在这里分享并更新您的答案。谢谢!
  • TemplateBinding 上没有 UpdateSourceTrigger,因为 TemplateBinding 是与视图的单向绑定。您发布的 MSDN 链接指出:TemplateBinding 始终是单向绑定,即使涉及的属性默认为双向绑定。不知道为什么它们不允许双向绑定。
  • 旧的,但我在这方面很挣扎。请注意,您可以为自己的依赖属性设置默认绑定:stackoverflow.com/questions/2663965/…。在我的情况下,我必须使用上面的绑定,Mode=TwoWay,我还将依赖属性默认绑定设置为两种方式。现在绑定到一个文本框就可以工作了,而不必在那里指定它必须是两种方式。
【解决方案2】:

您在注册属性时缺少回调。

这是一个示例代码。

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

【讨论】:

  • 不是这样的。回调将被调用,但绑定的 MyText 属性仍不会更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2012-12-06
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多