我很难理解ContextMenu的情况。我知道它被渲染为一个单独的窗口,带有一个单独的可视化树,因此我们不能使用相对绑定来绑定作为用户控件的属性公开的命令。例如以下不有效:
<MenuItem Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=TestCommand}" Header="Test" />
但是,如果将用户控件的数据上下文设置为将命令公开为属性的视图模型,则以下内容将起作用:
<MenuItem Command="{Binding TestCommand}" Header="Test" />
我不明白的是,如果它不是可视树的一部分,ContextMenu如何继承DataContext的值。我希望这两个例子的行为相同(即两者都有效或两者都失败)。
答案 0 :(得分:3)
第二个绑定因为所谓的“继承上下文”而起作用。你可以在这里阅读:http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx。基本上这是一种特殊情况,其中一些属性继承所有者对象的数据上下文。因此,例如,继承上下文始终适用于Freezable
类型的属性(另一篇关于Freezables的有趣文章:http://drwpf.com/blog/category/freezables/)。
实际上文章说继承上下文不适用于ContextMenu,但是在版本4中它们添加了它,所以它现在可以正常运行,就像你在你的例子中显示它一样。