【问题标题】:Binding three levels down in the data hierarchy在数据层次结构中向下绑定三个级别
【发布时间】:2011-12-05 23:54:36
【问题描述】:

这是一件好事,我不介意感到愚蠢。

我正在尝试绑定到我的视图模型上的 ObservableCollection。数据层次结构如下所示: Parent - 包含 - Child 对象的列表。没什么复杂的。

在我的 Xaml 树的最外层网格,我建立了一个到视图模型的链接:

<Grid DataContext="{StaticResource src}">

是的,在问题文本框正常工作之前,src 确实引用了视图模型和两打绑定。我的 Xaml 树中没有另一个 DataContext。现在我来到一个简单的文本框。我想将文本框文本绑定到 child.property。

这行得通:

  <TextBlock 
     DataContext="{Binding Parent}"
     Text="{Binding Path=Child.Property}"
     Style="{StaticResource headerMajor}"
  />

这不起作用:

  <TextBlock 
     Text="{Binding Source=Parent,Path=Child.Property}"
     Style="{StaticResource headerMajor}"
  />

我认为它们是同一件事的两种说法。通常我会想一想,然后继续编码。但是,我读过的一些建议提到,隐藏在 Xaml 控件中的 DataContext 属性可能会导致难以找到错误。

请解释为什么一个有效而另一个无效。这将有助于我掌握整个绑定主题。

吉姆

【问题讨论】:

标签: wpf xaml data-binding mvvm


【解决方案1】:

Source 是一个属性,其中包含一个用作绑定源的object,它不会解析为属性。因此,您的绑定正在寻找字符串 "Parent" 上的属性路径 Child.Property,看到问题了吗?

【讨论】:

  • 所以现在我很困惑。我以为我明白那句话的意思。我指定的 Source 是一个包含子对象的对象。我显然还不明白。我在这个项目上使用绑定的 Source= 部分的所有尝试都失败了。请再试一次解释应该指定什么 Source= : view model?家长?孩子?如果答案是视图模型,那么我该如何找到孩子?
  • @user858233:你应该只在极少数情况下使用Source,你真的应该阅读我链接到的文档,它的主要用例是绑定到使用指定为资源的对象StaticResource 标记扩展,例如Source={StaticResource ColorResource}。在这里,您可以将绑定更改为仅使用路径Parent.Child.Property(这听起来有点无意义,因为它应该与Property 相同。
  • @user858233:绑定路径始终是相对于源的,如果您不指定任何其他内容,则隐式源是当前的DataContext,如果您指定了源,则不使用DataContext .来源是SourceRelativeSourceElementName,选择一个或无。
  • 对不起,错过了答案中的链接。雾开始散去。这听起来正确吗?我的 Source= 对象之一可能是 myViewModel。我可以将其用作源,但我不能在 myViewModel 上使用属性,例如我的“父”属性。您的第一条评论是否暗示绑定“引擎”会沿着我的数据层次结构向下查找“属性”两个级别?
  • @JimBoone:源可以是任何对象,它也经常用于代码后面,您可以在其中执行 binding.Source = this 或任何其他对象,但在 XAML 中,您放置在那里的所有内容都被解释为一个字符串(除非它是另一个标记扩展)。不过,您可以使用元素语法创建绑定,然后您可以例如就地创建源。我的第一条评论只是对逻辑数据结构的思考,如果你上到Parent,然后再下到Child(假设只有一个),你应该从你开始的地方开始,因此可以省略整个位.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2013-07-04
  • 2023-04-03
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多