3

MyControlカスタムコマンドを公開するカスタムコントロール( )があります。Window親がこのコマンドを呼び出せるようにしたいのですが、全員MyControlsがそれに反応する必要があります。

コマンドをMyControlCommandBindingsコレクションに追加しました。これは、CanExecute常にtrueを返すコールバックも提供します。

私の問題は、このコマンドを呼び出すメニュー項目が有効にならないことです。これは、メニューがビジュアルツリーの上部にあるためだと思いますが、正直なところ、スコープが正確MyControlsにどのように機能するかについては少しあいまいです。RoutedUICommand

誰かが私が間違っていることを明確にすることができますか、またはこれが可能であるかどうか?

4

2 に答える 2

1

はい、要点は、カスタム コマンドの CommandBinding がビジュアル ツリーのメニュー項目よりも下にあるということです。msdnから

RoutedCommand の CanExecute メソッドが呼び出されると、PreviewCanExecute イベントがコマンド ターゲットで発生します。イベントが処理されない場合、CanExecute イベントが発生します。コマンド ターゲットにコマンドの CommandBinding がある場合、その CommandBinding の CanExecute ハンドラーが呼び出されます。コマンド ターゲットにコマンドの CommandBinding がない場合、CanExecute イベントは、コマンドに関連付けられた CommandBinding を持つ要素を検索する要素ツリーをバブルアップします。

このリンクのコマンドに関する非常に優れた記事。

とにかく、 CommandTarget などのメニュー項目からコマンドを使用できます

<MenuItem Header="Click me"  Command="local:CommandClass.MyCustomCommand" CommandTarget="{Binding ElementName=myCustomCtrl}" />

このようにして、特定のコマンド ソース (メニュー項目) がコマンドを特定のターゲット (カスタム コントロールのインスタンス) に送信します。

于 2012-10-04T13:16:11.910 に答える
1

ここでのコマンドは間違った意味だと思います。

コマンドは、さまざまなコマンド トリガー ソースを 1 つのコマンド ハンドラーにバンドルするために使用されます。したがって、コマンドはさまざまなコントロール、メニューなどからトリガーされますが、同じコマンド ハンドラーが呼び出されます。

イベントは一種の反対です。1 つのソースで複数のイベント ハンドラーをトリガーできます。

あなたの特別なケースでは、イベントを好み、UI ツリーの下のコントロールは、トンネリング イベントやバブリング イベントをリッスンします。

于 2013-01-31T09:07:56.723 に答える