【问题标题】:XAML Multi-Level Binding Source/Path IssueXAML 多级绑定源/路径问题
【发布时间】:2010-05-05 22:04:46
【问题描述】:

我有一个名为ChromeWindow(派生自Window)的XAML 对象,它的代码隐藏中有一个名为DependencyPropertyAppChrome,它存储对关联的ApplicationChrome XAML 对象(派生自UserControl)的引用。 ApplicationChrome 的 XAML 文件有一些 x:Name'd 对象(例如 TextBlock 和 Border),我想从 ChromeWindow 的 XAML 绑定到这些对象。 ChromeWindow 的根在 XAML 中是 x:Name'd 为 rootWindow,所以我认为这些绑定之一可以工作:

{Binding ElementName=rootWindow, Path=AppChrome.CaptionTextBlock.Text, Mode=OneWay}

但这会抱怨 BindingExpression 路径错误,因此无法在 ApplicationChrome 类型的对象上找到属性“CaptionTextBlock”(AppChrome 的 XAML 中的 x:Name'd TextBlock)

所以我尝试了这个绑定:

{Binding Source=AppChrome.CaptionTextBlock, Path=Text, Mode=OneWay}

仍然没有运气,这一次再次抱怨BindingExpression 路径错误,但这次它无法在String 类型的对象上找到CaptionTextBlock 属性

【问题讨论】:

  • “解决方案”(我非常宽松地使用该术语)是为我想通过绑定路径访问的 AppChrome 中的每个 XAML 元素以及 AppChrome 的 Loaded() 方法创建一个 DP按名称将 DP 设置为适当的元素。似乎 XAML 标记应该比这更聪明,我记得这在 .Net 3.5 SP1 中运行良好
  • Aaaand,这个解决方案就这么多。绑定永远不会从其源属性接收更新通知。太棒了。
  • 这在 .NET 3.5 或任何其他版本中永远不会起作用。

标签: wpf xaml binding path


【解决方案1】:

即使您已经命名了这些元素,它们也不能用于绑定,除非有为它们公开的依赖属性。

ApplicationChrome 需要公开一个名为 CaptionTextBlock 的依赖属性才能使此绑定起作用。

也许您可以解释为什么要尝试绑定到这些对象,以便我们更好地了解您的情况。可能有更好的方法,因为这种绑定不仅混乱而且不寻常。

【讨论】:

  • 我试图通过它们到达它们的属性作为最终目的地,而不是绑定它们自己。他们是否也需要成为 DP 才能绑定到他们的属性?如果是这样,是否有一种简单的方法可以将 x:Name'd XAML 元素转换为要访问的 DP?
  • 是的,但是 WPF 应该如何知道 AppChrome 上有一个 CaptionTextBlock?它只知道 AppChrome 是某种 UserControl,带有某种可视化树。在您的可视化树中,您已经命名了一个元素,但 WPF 不知道该元素的存在。它确实知道你的类上暴露的依赖属性,但这就是它所知道的全部。不,没有一个简单的方法可以做到这一点。也许你可以描述你试图通过这个绑定来完成什么。
  • WPF 应该知道该元素存在,因为它在对象的 XAML 中(这是部分类定义的一部分),并且 x:Name'd 元素成为该类的成员由于这个。如果 IntelliSense 可以解决,那么预编译器、编译器和链接器也没有理由不解决。无论如何,这看起来更像是绑定的 XAML 标记扩展路径解析器的问题 - 查看我为 .Net 3.5 SP1 编写的一些旧代码,这本来是可能的,但在 .Net 4.0 中它令人窒息。
  • 不,你错了。当您使用 x:Name 属性命名元素时,这些元素确实在可视化树中被实例化。但他们不会成为班级的成员。当您尝试绑定到 AppChrome.CaptionTextBlock 时,它将查看 ApplicationChrome 类。该类派生自 userControl,不公开任何名为 CaptionTextBlock 的公共属性。错误消息向您描述了这个确切的问题:“在 ApplicationChrome 类型的对象上找不到属性‘CaptionTextBlock’。”这永远不会奏效,也永远不会奏效。
猜你喜欢
  • 2015-09-25
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多