{Binding DataContext.foo} vs {Binding foo}差异

时间:2013-08-10 22:16:38

标签: wpf data-binding mvvm datacontext

我认为{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}}似乎失败了。我从来没有遇到过两者之间有什么区别可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

它们与两个微妙不同的东西绑定在一起:

"Binding DataContext.TestCommand"绑定到TestCommand的{​​{1}} Datacontext属性(可能是上下文定义了该属性)。

Page绑定到"Binding TestCommand"本身的TestCommand属性,在这种情况下可能不存在,这就是为什么它不起作用。

有一个名为WPF Snoop的简洁程序,您可以在事情运行时检查绑定(通常可以让我在遇到困难时理解事物)。

答案 1 :(得分:2)

视觉树( View )中的每个元素几乎都链接到每个DataContext属性的数据层( ViewModel )。当然,数据层树更简单,因为大多数控件只是从它们的父级继承。

默认情况下,Binding正在数据层中查找Path。但是,如果您指定RelativeSource(例如RelativeSource.SelfAncestorType)或ElementNameBinding会切换到可视图层,并在控件中搜索绑定属性。使用DataContext,您可以返回数据层。