我正在努力了解ContextMenu发生了什么。我知道它是作为一个单独的窗口呈现的,带有一个单独的可视树,因此我们不能使用相对绑定(bind)来绑定(bind)作为用户控件属性公开的命令。例如以下不起作用:

<MenuItem Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=TestCommand}" Header="Test" />

但是,如果将用户控件的数据上下文设置为将命令作为属性公开的 View 模型,则可以进行以下操作:
<MenuItem Command="{Binding TestCommand}" Header="Test" />

我不明白的是,如果ContextMenu不属于可视化树的一部分,它如何继承DataContext的值。我希望这两个示例的行为相同(即都可以工作,或者都可以失败)。

最佳答案

第二个绑定(bind)的工作是由于所谓的“继承上下文”。您可以在这里阅读有关信息:http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx。基本上,这是一种特殊情况,其中某些属性继承了所有者对象的数据上下文。因此,例如,继承上下文始终适用于Freezable类型的属性(有关Freezables的另一篇有趣的文章:http://drwpf.com/blog/category/freezables/)。

实际上,文章说继承上下文在ContextMenu上不起作用,但是在版本4中,他们添加了继承上下文,因此它实际上可以正常工作,如您在示例中所展示的那样。

09-25 17:20
查看更多