2009-07-15 10 views
0

別々のウィンドウにある2つのボタンに同じカスタムRoutedCommandを使用したいと思います。グローバルカスタムRoutedCommandを定義する方法は?

コードを繰り返さないために、私はコマンドをアプリケーションのどこかに定義し、両方のボタンにバインドしたいと考えています。

私はそれを達成するためにスタイルを使用することを考えました。以下、簡単なサンプルで問題を再現します。

私はApp.Xamlでスタイルを宣言:App.Xaml.csで

<Application.Resources> 
    <Style TargetType="{x:Type Window}"> 
     <Setter Property="CommandBindings"> 
     <Setter.Value> 
    <!--<Window.CommandBindings>--> <!--I tried with or without this. Doesn't change--> 
       <CommandBinding Command="{x:Static local:App.testBindingCommand}" 
        Executed="OnExecuted" CanExecute="OnCanExecute" /> 
     <!--</Window.CommandBindings>--> 
     </Setter.Value> 
     </Setter> 
    </Style> 
</Application.Resources> 

とカスタムコマンド:

public static RoutedCommand testBindingCommand = new RoutedCommand(); 

    private void OnExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("OnExecuted"); 
    } 

    private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("OnCanExecute"); 

     e.CanExecute = true; 
    } 

コンパイラがコードを好きで、エラーを与えるものではありません。

エラーMC3080:プロパティセットター 'CommandBindings'は、アクセス可能なセットアクセサを持たないため設定できません。

AFAIKでは、WindowクラスにはCommandBindingsプロパティがあります。

1)グローバルコマンドバインディングを正しく宣言するためにスタイルを使用していますか?そうでない場合は、どうすればいいですか?

2)スタイルでプロパティCommandBindingsを設定できないのはなぜですか?

ありがとうございます!

答えて

1

プロパティの値(タイプがCommandBindingsCollection)がCommandBindingのインスタンスに設定されているため、このエラーメッセージが表示されます。プロパティにセッターがある場合でも、CommandBindingCommandBindingsCollectionに設定することはできません。

は、通常のコマンドを結合する場合を考えてみましょう:

<Window> 
    <Window.CommandBindings> 
     <CommandBinding Command="{x:Static local:App.testBindingCommand}" 
      Executed="OnExecuted" CanExecute="OnCanExecute" /> 
    </Window.CommandBindings> 
</Window> 

これはCommandBindingsプロパティにCommandBindingを設定するのではなく、WindowCommandBindingsコレクションに追加されていません。

RoutedCommandを使用する必要がありますか? ICommandの別の実装を使用する方が良いかもしれません。おそらくコマンド実行時にdelegateを呼び出すものです。 Kent BoogaartにはDelegateCommandの実装があります(他にも同様の実装が多数あります)。

+0

実際、CommandBindingsCollectionとCommandBindingの間のバインディングは正しいです。だから私は最初にを試したのです(app.xamlのコメントを参照してください) 私はDelegateCommandでlokkを取るでしょう – rockeye

+0

あなたは正しいです。 RelayCommand(またはDelegateCommand)を使用する方がはるかに簡単で、CommandBindingの使用は避けてください。ありがとう – rockeye

関連する問題