我认为{Binding DataContext.foo}
和{Binding foo}
是相同的,直到我遇到将选择更改事件从ComboBox
绑定到我的ViewModel中的命令的问题。
我是这样做的......
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" />
</i:EventTrigger>
在DataContext.TestCommand
指定TestCommand
时,使用{{1}}似乎失败了。我从来没有遇到过两者之间有什么区别可以解释一下吗?
答案 0 :(得分:2)
它们与两个微妙不同的东西绑定在一起:
"Binding DataContext.TestCommand"
绑定到TestCommand
的{{1}} Datacontext
属性(可能是上下文定义了该属性)。
Page
绑定到"Binding TestCommand"
本身的TestCommand
属性,在这种情况下可能不存在,这就是为什么它不起作用。
有一个名为WPF Snoop的简洁程序,您可以在事情运行时检查绑定(通常可以让我在遇到困难时理解事物)。
答案 1 :(得分:2)
视觉树( View )中的每个元素几乎都链接到每个DataContext
属性的数据层( ViewModel )。当然,数据层树更简单,因为大多数控件只是从它们的父级继承。
默认情况下,Binding
正在数据层中查找Path
。但是,如果您指定RelativeSource
(例如RelativeSource.Self
或AncestorType
)或ElementName
,Binding
会切换到可视图层,并在控件中搜索绑定属性。使用DataContext
,您可以返回数据层。