Привязка WPF ContextMenu MenuItem к свойству UserControl против свойства ViewModel - PullRequest
3 голосов
/ 07 февраля 2011

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

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

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

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

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

1 Ответ

3 голосов
/ 07 февраля 2011

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

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

...