CommandBinding в Window не перехватывает выполнение команды из ContextMenu - PullRequest
4 голосов
/ 26 мая 2009

Довольно простой и понятный пример.

У меня есть окно. В нем установлены CommandBindings для перехвата выполнения RoutedUICommand.

<Window
   ...
   >
   <Window.CommandBinding>
       <CommandBinding 
           Command="{x:Static local:Commands.Command1}"  
           Executed="OnCommand1Executed" 
           CanExecute="OnCanCommand1Execute" 
           />
   </Window.CommandBinding>
</Window>

В окне размещен UserControl, внутри которого объявлено ContextMenu. Элемент ContextMenu имеет свойство Command, назначенное той же самой RoutedUICommand.

<ContextMenu>
    <MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>

Но пункт меню остается неактивным (== отключен). Каким-то образом выполнение команды не доходит до окна. Может быть, это потому, что ContextMenu находится внутри всплывающего окна?

Все работает правильно, если я добавляю необходимую CommandBinding в коллекцию ContextMenu.CommandBindings. Но это ужасный вариант - не иметь места для единственной «глобальной» CommandBinding.

Как решить проблему наилучшим образом?

UPD: Оказывается, все не так плохо. Команды не связаны только в первый раз пользователь открывает меню. Если он закрыт и снова открыт, все в порядке. Тем не менее, это кажется нежелательным и довольно странным поведением.

Ответы [ 2 ]

4 голосов
/ 07 июня 2009

Это все еще происходит, если вы добавляете Focus (); сразу после InitializeComponent (); в конструкторе windows?

Похоже, у WPF возникла проблема с поиском визуального дерева из контекстного меню. Установка фокуса на главное окно может исправить это.

1 голос
/ 22 августа 2009

Как мы можем решить эту проблему в пользовательском элементе управления? Кажется, что фокус не работает в этом контексте

Обновление: я нашел решение здесь Как установить CommandTarget для MenuItem внутри ContextMenu?

Похоже, это связано с CommandTarget

<MenuItem x:Name="mnuProperties" Header="_Properties"
          Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}"
          CommandTarget="{Binding PlacementTarget,
          RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...