2

在遇到将选择更改事件从 a 绑定到我的 ViewModel 中的命令的问题之前,我认为{Binding DataContext.foo}并且是相同的。{Binding foo}ComboBox

我是这样做的...

<i:EventTrigger EventName="SelectionChanged">
     <cmd:EventToCommand Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" />
</i:EventTrigger>

仅指定时使用DataContext.TestCommand作品TestCommand似乎失败。我从来没有遇到过两者之间的区别,谁能解释一下?

4

2 回答 2

2

它们绑定到两个微妙不同的东西:

"Binding DataContext.TestCommand"绑定到您TestCommand的.DatacontextPage

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

有一个名为 WPF Snoop 的简洁程序,您可以使用它在事情运行时检查绑定(当我陷入困境时,通常可以帮助我理解事情)。

于 2013-08-10T22:58:06.777 回答
2

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

默认情况下 aBinding正在寻找Pathin 数据层。但是,如果您指定一个RelativeSource(likeRelativeSource.Self或 with AncestorType)或一个ElementName切换Binding到可视层并在控件中搜索绑定属性。DataContext你可以回到数据层。

于 2013-08-10T23:08:04.317 回答