2011-12-22 4 views
14

私はICommandパターンを使用する必要がある理由を私に尋ねた同僚がいます。なぜICommandはVMを呼び出すコードよりも優れていますか?

彼は、ボタンを追加して、そのコードの後ろにイベントを作成する必要があります。イベントから、彼はViewModel上のメソッドを呼びたいと思っています。

私は彼に明らかな答えを与えました。これは、ViewとViewModelの間の結合を追加します。しかし彼は、ViewとViewModelはすでに結合されていると主張しました。 (私たちは、背後にあるビューのコード内のViewModelに私たちのビューのDataContextの設定:DataContext = new MyViewModel();

はい、私は彼の方法は、「複数の結合」を追加することを彼に告げたが、それも私には少しラメ聞こえた

をので、。私はICommandがきれいな方法であることを知っています。私はそれをそうします。しかし、既存のカップリングを使用する以外に、ICommandはあなたに何を買うのですか?

+0

私はここで同じ質問をしました:http://stackoverflow.com/questions/3345124/what-is-the-real-advantage-of-keeping-code-out-of-the-xaml-code-behind –

答えて

10
  • それはデカップリングではないのですが、どのように深いあなたのModelView階層内に浸透することができますないイベントをポンプが、イベントがをルーティング、組み込みの枠組みの中で。

  • コマンドは状態(CanExecute)を持っています。コマンドを制御に割り当てると、コマンドの状態がfalseになると、制御は無効になります。それはあなたに強力なUI状態管理方法を提供し、特に複雑なUIのためにスパゲティコーディングをたくさん避けます。

+1

1つの状態に言及するための+1(Command.CanExecuteメソッド) – Adam

3

ICommandは、今すぐ使用できます。これはcanexecuteメソッドで処理されます。

3

CanExecuteコントロールのプロパティへのコマンドのメソッド、またCommandは、良い方法でアクションをカプセル化します。私の意見/経験では、このアプローチは、単一の抽象化で条件と実行アクションの両方を持つため、理解してテストするのが簡単なため、多くの意味があります。

今後このアクションが繰り返される場合は、独自のカスタムICommandで簡単に抽象化し、いくつかの場所で使用できます。

4

私は彼がICommandの パターンを使用しなければならない理由を私に尋ねた同僚を持っています。

それは(明示的に記述または暗黙のかどうか)これはあなたの会社の標準ある暗黙のよ​​うです。それは彼の質問に十分に答えるべきです。

すべての会社コードがそのパターンを使用することになっている場合、他の誰かが自分のコードをデバッグする必要がある場合、共同開発者の混乱と不満を引き起こす可能性があります。

私の意見では、ICommandを使用すると、ICommandプロパティをプログラムを実行する必要がないため、開発/モックアップが高速になります。 UIデザイナーは、あなたのコーディングに遅れていても、それらのタスクを完全に完了することができます。

1

私が前の回答で見たことのないことの1つは、ICommandを使用すると、コードの再利用が促進され、異なるGUIコンポーネントで同じアクションを使用できるようになることです。たとえば、ウィンドウを開くためのコマンドがあり、そのコマンドを3つまたはアプリケーションの異なる画面で呼び出すことができる場合、ICommandの実装では、そのロジックを1つの場所に定義できます。コードビハインドイベントハンドラでは、DRYに違反して冗長なコードをコピーして貼り付ける必要があります(そうでなければ、クラスに抽象化して独自の実装をロールバックする必要があります。 ICommand)。

関連する問題