非常に単純でわかりやすい例です。
窓があります。RoutedUICommandの実行をキャッチするようにCommandBindingsが設定されています。
<Window
...
>
<Window.CommandBinding>
<CommandBinding
Command="{x:Static local:Commands.Command1}"
Executed="OnCommand1Executed"
CanExecute="OnCanCommand1Execute"
/>
</Window.CommandBinding>
</Window>
ウィンドウでホストされているUserControlがあり、その中でContextMenuが宣言されています。ContextMenuアイテムには、同じRoutedUICommandに割り当てられたCommandプロパティがあります。
<ContextMenu>
<MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>
ただし、メニュー項目は非アクティブのままです(==無効)。どういうわけか、コマンドの実行はウィンドウに上がらない。多分それはContextMenuがポップアップの中にあるからですか?
必要なCommandBindingをContextMenu.CommandBindingsコレクションに追加すると、すべてが正しく機能します。しかし、それは単一の「グローバル」CommandBindingの場所を持たないというひどいオプションです。
どうすれば最善の方法で問題を解決できますか?
UPD:それほど悪くはないことがわかりました。コマンドは、ユーザーが最初にメニューを開いたときにのみバインドされません。閉じて再度開いた場合は、すべて問題ありません。それでも、それは望ましくなく、かなり奇妙な振る舞いのようです。