Эта проблема связана с тем, что ContextMenu находится в отдельном визуальном и логическом дереве для окна и его элементов управления.
Для тех, кто все еще ищет ответ на этот вопрос. После обхода Интернета я нашел наиболее эффективный ответ - включить следующее в любое объявление элемента MenuItem, для которого его команды должны быть услышаны его «владельцем».
С точки зрения непрофессионала; если вы хотите, чтобы команды вашего контекстного меню были услышаны нажатием правой кнопки мыши. Добавьте этот код:
CommandTarget="{Binding Path=PlacementTarget,
RelativeSource={RelativeSource AncestorType=ContextMenu}
}"
Пример:
<ContextMenu>
<MenuItem Header="Close" Command="Application.Close"
CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
</ContextMenu>
Это также будет работать в шаблонах (я обнаружил, что многие другие решения не поддерживают). Вот объяснение значения заявления, взятого из другого места (я ужасен при объяснении вещей):
Каждый FrameworkElement имеет DataContext, который является произвольным объектом. Источником привязки данных по умолчанию является DataContext. Вы можете использовать RelativeSource.Self, чтобы изменить источник для привязки к самому FrameworkElement вместо его DataContext. Таким образом, часть RelativeSource просто перемещает вас «на один уровень» вверх от DataContext FrameworkElement до самого FrameworkElement. Когда вы находитесь в FrameworkElement, вы можете указать путь к любому из его свойств. Если FrameworkElement является Popup, у него будет свойство PlacementTarget, которое является другим FrameworkElement, к которому Popup относится.
Короче говоря, если у вас есть всплывающее окно, помещенное, например, относительно TextBox, это выражение устанавливает DataContext из всплывающего окна в TextBox, и в результате {Binding Text} где-нибудь в теле всплывающего окна будет привязываться к тексту. текстового поля.
Я искренне надеюсь, что эта информация спасет кого-то, кто плохо знаком с WPF, от головной боли, которую я пережил на этих выходных ... хотя она многому меня научила!