【发布时间】:2015-01-05 00:53:35
【问题描述】:
我不太习惯 WPF,所以这可能很容易,但我已经为此苦苦挣扎了几个小时,似乎无法正确地做到这一点。
假设我有一个从 UserControl 下降的BaseUserControl,其依赖属性为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”的绑定源。绑定表达式:路径=文本;数据项=空;目标元素是'MyTestControl'(名称='');目标属性是“文本”(类型“字符串”)
但它只发生在“MyTestControl”的属性上,不会发生在 XAML 中与同一属性的任何其他绑定。
【问题讨论】:
-
这真的很奇怪。任何其他容器(不是 UserControl)的类似绑定方案都可以完美运行。虽然原因还不清楚,但是可以尝试反向绑定(目标是
MyTextBox,源是usercontrol,当然要使用TwoWay绑定模式)。 -
这行不通,因为我无法为其指定名称(
BaseUserControl将是抽象的)。我可以为BaseUserControl类型做一个FindAncestor但这不是一般的(它可以在两者之间找到其他BaseUserControls)