我不太习惯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中对同一属性的任何其他绑定。
答案 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);
}