2011-12-05 67 views
0

这是一件好事,我不介意感到愚蠢。在数据层次结构中绑定三个级别

我想绑定到我的视图模型上的ObservableCollection。数据层次结构如下所示:父 - 包含 - 子对象的列表。没什么复杂。

在我的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属性可能导致难以发现的错误。

请解释为什么一个人工作,另一个不工作。这将有助于我掌握整个具有约束力的话题。

吉姆

+0

请看[编辑帮助](http://stackoverflow.com/editing-help#code)。 –

回答

1

Source是保持用作源用于结合一个object一个属性,它不能解决的媒体资源。因此,您的绑定正在寻找字符串"Parent"上的属性路径Child.Property,请参阅问题?

+0

所以现在我很困惑。我以为我明白那句话的意思。我指定的源是一个包含子对象的对象。我显然还没有明白。我所有使用Source =部分绑定的尝试都始终在这个项目上失败。请再试一次来解释应该指定为Source =:view model?家长?孩子?如果答案是视图模型,那我该如何找到孩子? – JimBoone

+0

@ user858233:你应该只在很少的情况下使用'Source',你应该阅读我链接到的文档,它的主要用例是绑定到使用'StaticResource'标记扩展指定为资源的对象,例如。 'Source = {StaticResource ColorResource}'。在这里您可以将绑定更改为仅使用路径Parent.Child.Property(这听起来有点无意义,因为它应该与“Property”相同。 –

+0

@ user858233:绑定路径始终是相对于源的,隐式如果你没有指定任何其他的东西,那么就是当前的'DataContext',如果你指定了一个源,'DataContext'没有被使用。源是'Source','RelativeSource'和'ElementName',选择一个或者没有。 –

相关问题