Привязки в WPF contextmenu с пункта управления имущество против модели ViewModel собственность


Я изо всех сил пытаюсь понять, что происходит с ContextMenu. Я знаю, что он отображается как отдельное окно с отдельным визуальным деревом, поэтому мы не можем использовать относительную привязку для привязки команды, представленной как свойство пользовательского элемента управления. например, следующее не работает:

<MenuItem Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=TestCommand}" Header="Test" />
Но если вы зададите контекст данных пользовательского элемента управления для модели представления, которая предоставляет команду в качестве свойства, будет работать следующее:
<MenuItem Command="{Binding TestCommand}" Header="Test" />

Чего я не понимаю, так это как это ContextMenu наследует значение DataContext, если оно не является частью визуального дерева. Я бы ожидал, что оба этих примера будут вести себя одинаково (то есть оба работают или оба терпят неудачу).

1 3

1 ответ:

Вторая привязка работает из-за так называемого "контекста наследования". Вы можете прочитать об этом здесь: http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx . в основном это своего рода частный случай, когда некоторые свойства наследуют контекст данных объекта владельца. Так, например, контекст наследования всегда работает со свойствами типа Freezable (Еще одна интересная статья о Freezables: http://drwpf.com/blog/category/freezables/).

На самом деле в статье говорится, что контекст наследования не работает на ContextMenu, но в версии 4 они добавили его, поэтому он действительно работает сейчас, как вы показали в своем примере.