在XAML中将root属性绑定到子元素的值

时间:2014-11-08 06:56:17

标签: c# wpf xaml binding

我不太习惯WPF,所以这可能很容易,但是我已经苦苦挣扎了几个小时,似乎无法正确地做到这一点。

假设我BaseUserControl来自UserControl,并且依赖属性Text

然后在XAML中我正在创建一个BaseUserControl后代。我希望将属性Text绑定到该后代中定义的控件。说:

<base:BaseUserControl
         ... all namespaces ...
         xmlns:base="clr-namespace:MyControlsBase"
         x:Class="Test.MyTestControl"
         Text="{Binding ElementName=MyTextBox, Path=Text}"
    <TextBox x:Name="MyTextBox" Text="MyText" />
</base:BaseUserControl>

出于某种原因,我无法让MyTextBox更新控件本身的Text属性。

如果我添加:

<TextBlock Text="{Binding ElementName=MyTextBox, Path=Text}" />

控件内的任何地方,文本块显示正确的TextBox值,因此绑定定义似乎不是问题。

我还有其他东西可以显示Text在该控件中的价值......比如说:

<Window>
  <StackPanel>
    <test:MyTestControl x:Name="MyControl" />
    <TextBlock Text="{Binding ElementName=MyControl, Path=Text}" />
  </StackPanel>
</Window>

如果我从任何其他方式(代码隐藏,或其他)更新MyControlBase上的Text属性,它的工作原理,我看到文本块上的文本发生了变化...但是当TextBox里面的文本框中看起来不行本身已更新。

继承控件时,对属性的绑定是否有任何限制?

PS:对于这个问题,代码显然是人为的,并且是为了解决这个问题

注意:该属性上的绑定显然有问题,因为在跟踪窗口中,创建控件时,我得到一个:

  

System.Windows.Data错误:4:无法找到引用'ElementName = MyTextBox'的绑定源。 BindingExpression:路径=文本;的DataItem = NULL; target元素是'MyTestControl'(Name =''); target属性是'Text'(类型'String')

但它只发生在`MyTestControl的属性中,而不是发生在XAML中对同一属性的任何其他绑定。

1 个答案:

答案 0 :(得分:2)

我认为问题是当BaseUserControl初始化自己并尝试使用MyTextBox的Text属性绑定时,MyTextBox尚未初始化。在这个阶段,MyTextBox不存在,因此您得到'System.Windows.Data错误:4:找不到 SOURCE 用于绑定引用'。

您可以在MyTestControl的CTOR中的InitializeComponent()之后绑定代码隐藏。

public MyTestControl()
{
   InitializeComponent();
   Binding b = new Binding("Text");
   b.Source = MyTextBox;
   SetBinding(TextProperty, b);
}