2009-07-10 13 views
0

私は別個のファイルに2つの異なるUI要素、すなわちmenuItem(window.xaml内)とuserControl(foo.xaml内)を持っています。別のコントロールで同じRoutedCommandを使用するにはどうすればよいですか?

両方ともまったく同じロジックを持っています。条件が一致した場合にのみ有効になり、同じメソッドを呼び出します。このロジックをコーディングするには、RoutedCommandsを使用します。

私はCanExecuteとを実行しに同じ条件でそれぞれのファイルに2つの異なるRoutedCommandsを使用することができます。できます。

私は、D.R.Y.に従うコードを改善したいと思います。 routedCommandと接続されたメソッドをルール化し、外部化します。これは、両方のファイルに結合されています:

<CommandBinding Command="{x:Static RoutedCommands:TestRoutedCommand.test}" 
        Executed="RoutedCommands:TestRoutedCommand.OnTest" 
        CanExecute="RoutedCommands:TestRoutedCommand.CanTest" /> 

これはTestRoutedCmmand.csです:

public class TestRoutedCommand 
{ 
    public static RoutedCommand test = new RoutedCommand(); 

    public static void OnTest(object sender, ExecutedRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("test -on"); 
    } 

    public static void CanTest(object sender, CanExecuteRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("test -can"); 

     e.CanExecute = true; 
    } 
} 

私が行うと、そのコンパイラレポートこのエラー:

Error 1 unknown generation error, 'MC6005 :   
Executed="RoutedCommands:TestRoutedCommand.OnTest" is not valid. 
'RoutedCommands:TestRoutedCommand.OnTest' is not a valid name for an event handler method. 
Only instance methods of the generated class or code-behind are valid 

(翻訳かもしれません元のメッセージが英語でないため正確ではない)

外部の方法サポートされていませんが、私は何かを見逃していないと確信しています。私の方法が静的であるという事実であるのだろうか?

私のメソッドを外部化する別の方法はありますか?これらの4つのメソッドを2つだけ呼び出す方法がありますか?

注:私のプロジェクトでは、これは30個以上の複製されたroutedCommandメソッドの呼び出しが2つしかありません...これが私をそんなに悩ます理由です。

ありがとうございました。

答えて

0

私は自分自身に答える:

コンパイラがRoutedCommandのではextern代表団を受け入れないと、ベストプラクティスは次のようにのICommandのカスタム実装を使用することですthese。コマンドバインディングは不要で、問題は解決しました。

+1

残念ながらリンクはもう有効ではありません。私は非常に提案されたソリューションに興味があります、あなたはそれを説明することができますか? – Wilbert

1

RoutedCommandは、クラスにstaticのメンバー(たとえば、Commands)です。あなたはCommandプロパティにそのstaticメンバーを渡す必要があります:

<CommandBinding Command="{x:Static local:Commands.TestCommand}" 
        Executed="RoutedCommands.TestRoutedCommand.OnTest" 
        CanExecute="RoutedCommands.TestRoutedCommand.CanTest" /> 
+0

確かに、私はx:静的を忘れてしまった...ありがとう、しかしこれは私の問題を解決しません。これを修正してより正確にするために私の質問を編集しました。 – rockeye

関連する問題