0

アプリケーションのメニューにCanExecuteパラメーターを使用する際にジレンマに直面しています。CommandBinding

状況は次のとおりです。アプリケーション自体は、作業モード、レビュー モードなどの特定のモードで実行できます。モードに応じて、一部のメニュー項目を有効または無効にする必要があります (したがって、実行可能または不可能)。

これまでに行ったことは、CanExecute の 4 つのイベント ハンドラーを作成することです。

private void Mode1CanExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode1CannotExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode2CanExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode2CannotExecute(object sender, CanExecuteRoutedEventArgs e);

一部のメニュー コマンドは両方のモードに共通であるため、一部は各モード専用です。

アプリケーションが開発されるにつれて、特定のメニュー コマンドをその時点で実行する必要があるかどうかを決定する要因が増えます。私が考えることができる解決策は次のとおりです。

  • イベントハンドラーにブールマルチバインディングを追加しましたCanExecuteが、このソリューションの例が見つかりませんでした.不可能だと思います.
  • さらに長い名前のイベントハンドラーを追加するCanExecuteと、実際にはコードが読みにくくなります
  • 「メニュー項目ごと」CanExecuteのイベントハンドラーを持ち、各イベントハンドラーのコードをいくつかのブール変数に基づいて、その結果を決定します

メニュー項目の有効化はイベント ハンドラーで実行できることは知っていますSubmenuOpenedが、多くのコマンドには もKeyGesture定義されています。

私の質問は次のとおりです。この場合のベスト プラクティスは何でしょうか。アプリケーションのロジック (コマンド実行の可用性) が保証され、コードの読みやすさも妥当なレベルに保たれますか?

ご提案ありがとうございます。

4

2 に答える 2

1

私がしていること - 私は常にcanexecuteコマンドごとに1つのメソッドを持っています.

1つの方法でそれを行うもう1つのポイントは、純粋なテスト容易性と読みやすさです。

その場合、テストは非常に簡単です

public bool CanExecuteGoCommand(){
 if (xxx)
  return true;
 else
  return false;
}

メソッドは必要なだけ大きくすることができ、条件、モード、変数などを必要とするだけの数の If を使用できます。

于 2016-03-09T10:56:45.810 に答える