ここで1つのポイントが欠落しているようです。特定のコマンドのCommandTargetは、そのコマンドのCommandBindingを定義するオブジェクトにしかなれません。
編集:システムに誤解を招く情報を残さないように、次の段落を明確にして修正しました。
コマンドルーティングは、イベントルーティングの特殊なケースです。つまり、論理ツリーを上下に移動するイベントです。InputBindings、Buttons、MenuItemsなどのICommandSourceインターフェイスを実装するコントロールは、CommandSourcesです。コマンドを発生させると、RoutedEventがCommandTargetで開始されます。これは通常、キーボードフォーカスを持つ要素です。イベントは、ルートに到達するまで論理ツリーを上に移動します。この方法でコマンドのCommandBindingsを持つすべての要素は、コマンドを処理する機会を取得しますが、通常、コマンドを処理する最初の要素が優先され、ルーティングプロセスが停止します。コマンドのCommandBindingがある場合、これはCommandSource自体である可能性もあり、おそらくそれが最初の引用です。要素がイベントを処理する場合、
混乱を完全にするために、ICommandSourceインターフェイスはCommandTargetと呼ばれるプロパティを定義します。このプロパティは、コマンドルーティングを短絡し、キーボードのフォーカスがどこにあっても、コマンドを処理するための特別なコントロールが必要な場合に使用します。この場合、問題のButtonまたはMenuItemにCommandTarget = "{Binding ElementName=MyCommandTargetControl}"のようなものを記述します。この場合も、このコントロールにコマンドのCommandBindingが含まれていることを確認する必要があります。そうでない場合、コマンドは永続的に無効になります。