【问题标题】:Bind property of root to value of child element in XAML将根的属性绑定到 XAML 中子元素的值
【发布时间】: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

标签: c# wpf xaml binding


【解决方案1】:

我认为问题在于,当 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);
}

【讨论】:

  • 这行得通,我将其标记为答案...但是,我尝试了相同的方法,但使用b.ElementName = "MyTextBox"而不是b.Source = MyTextBox(在构造对象之后)并且它也不能从代码隐藏中工作(同样的问题,说Cannot find source with ElementName='MyTextBox')。这绝对不是关键,但我想了解它为什么不起作用。
  • 刚刚在 .NET framework 4 和 4.5 中测试过,b.ElementName = "MyTextBox" 和 b.Source 一样好用。不知道为什么你的不起作用。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2011-02-23
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2015-03-06
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多