Привязка WPF ContextMenu MenuItem к свойству UserControl против свойства ViewModel

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

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

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

<MenuItem Command="{Binding TestCommand}" Header="Test" />

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

1 ответ

Решение

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

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

Другие вопросы по тегам