2009-05-26 1 views
4

非常に簡単でわかりやすい例です。WindowのCommandBindingはContextMenuからのコマンドの実行をキャッチしません

私には窓があります。これは、CommandBindingsがRoutedUICommandの実行をキャッチするように設定されています。

<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:それほど悪くはないことが分かります。コマンドは初めてユーザーがメニューを開くときにのみにバインドされていません。それが閉鎖され、再開された場合、すべてが問題ありません。それでも、それは望ましくないことであり、非常に奇妙な行動です。

答えて

4

これは、Focus()を追加した場合でも発生します。 InitializeComponent()の直後。ウィンドウのコンストラクタで?

これは、WPFがコンテキストメニューからビジュアルツリーを見つける際に問題があるようです。フォーカスをメインウィンドウに設定すると、それを修正する可能性があります。

+0

に関係だと思われるが、私はこれを考えますその回避策を最初に見た場所だったhttp://cebla5.spaces.live.com/blog/cns!1B8262ED00250003!206.entry?wa=wsignin1.0&sa=834175698 –

+0

これはとても奇妙ですが、動作します、ありがとうございます: ) – arconaut

+0

代替回避策については、http://stackoverflow.com/a/6070771を参照してください。 IMHOより良いアプローチ - XAMLのみで、フォーカスの副作用には依存しませんが、XAMLの "オブジェクトのインスタンスにオブジェクト参照が設定されていません"という偽のエラーメッセージが表示されるという欠点がありますエディタ(ちょうどエディタで...コードはまだコンパイルされ、うまく動作します)。私がそのエラーを修正する方法を見つけ出すことができれば、代替案が100%好ましいと言えます。 –

1

この問題をユーザーコントロールでどのように処理できますか?これは、フォーカスがそのコンテキストで

アップデートを動作しないようです:私はここに解決策を見つけたHow to set CommandTarget for MenuItem inside a ContextMenu?

は、信用が原因です信用を与えるためにCommandTarget

<MenuItem x:Name="mnuProperties" Header="_Properties" 
      Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}" 
      CommandTarget="{Binding PlacementTarget, 
      RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/> 
関連する問題