2009-06-15 12 views
3

私の名前はスペインのJesúsです。私は.NETの開発者です。数日前にこの素晴らしいWebを発見しました。MVVMのパターンに関する質問があります

MVVMパターンについていくつか質問があります。回答できる場合は嬉しく思います。
私は3ヶ月前にWPFを使い始めました。私はMVPパターンを学びました。
MVPはとても良いアプリケーションです。

私はどこでもMVVMを見始めましたが、誰もが自分の方法でパターンを使用しています。
すべてのブロガーはWPFのブログでMVVMについて話していますが、実装はすべて個別です。

私は今CodePlexでMVVMツールキットを使用する実装に焦点を当てていますが、質問があり、あまり情報を見つけることができません。

MVVMはMVPのバリエーションだと思います。
MVPでは、すべてのビューにビューのジョブを実行するプレゼンターがあります。
MVVMでは、これは同じことですが、できる限りコマンドを使用しています。

また、イベントが必要な場合は、MVPと似ています。イベントを発表者/ View-Modelに委譲します。つまり、ビューの仕事ではない場合(UIの更新など)です。

一方、View-ModelにはViewリファレンスがありませんので、データバインディングをより強くしなければなりません。
DelegateCommandsを使用する必要があります(これはRelayCommandsと同じものです)。

質問... 2つのビュー/ユーザーコントロールで同じView-Modelを使用するのは安全ですか?

ああ...私はMVVMをプレイしているときに昨日問題に遭遇しました。
私はキーバインディングの事のために私のコマンドのCommandReferenceを作成し、私は私のボタンのコマンドプロパティにこの参照を割り当てられ、よく、CanExecutedが最初に働いたがCanExecutedは本当だったとき、それはIsEnabledプロパティを更新しませんでした。私は、コマンドを直接ボタンにバインドし、参照を使用しないことで修正しました。問題は、なぜオブジェクトに参照をリンクするコードがあり、他のコードが直接コマンドをバインドするのはなぜですか?

MVVMに関連するものは何ですか? (私は昨日付けられた行動と呼ばれるものを見ましたが、私はそれが何であるか分かりません)。

私はMVPを使用して開発したメモタッキングアプリを書き換えていますが、現在はMVVMを使用しています。私はイベントをDelegateCommandを使って置き換え、View-Modelでビューの参照を取り除きます。MVVMの例はMVPによく似ているので、それはすべてです。

このパターンで私が持っているすべての誤解を指摘していただければ幸いです。

はありがとう、将来的に、私は次のMVVM初心者:)

答えて

12

うわーを助ける、私は、特定の技術やフレームワークを伴わないご質問、の多くに答えることをしようとするつもりですできるだけ...私はいくつかをお見逃し申し訳ありません(箇条書きの点が助けになるでしょう)

  • MVVMは必ずMVPのバリエーションではありません。 MVP自体はあいまいで読み込まれた用語です。 Martin Fowlerはsplitting it into two patternsによってそれを正義しました。 MVVMは独立していますが、MVPパターンといくつかの概念を共有しています。すべてのUIパターンと同様に、ビューロジックとビジネスロジックを可能な限り分離しています。 MVVMはMVPとは異なり、プレゼンテーションの目的で純粋にモデルを作成します(またはpresentation model)。これは、MVPパターンが分離問題を解決する方法とは異なります。
    • Passive View - パッシブビューでは、ビューにモデルが表示されません。
    • ​​- MVVMはパッシブビューよりも監督コントローラパターンにはるかに近いです。ここでの唯一の本当の違いは、MVVMは、明示的にとなるためViewModelには、ビューへの参照を持っていないだけでビューのためのモデル(そのため「ビューモデル」)
  • を作成しているかもしれませんビューのデータのモデル。これは適切な抽象化です。ビューを参照する場合は、追加の結合を作成する双方向の依存関係があります。また、ViewModel自体にはViewを意識する本当の理由はありません。その唯一の仕事は、ビューからモデル(実際のビジネスモデル)を抽象化することです。
  • DelegateCommandsとRelayCommandsとの違い - ここでは技術が限定されていると思いますので、私は本当にそれにうまく答えられません。
  • 複数のビューに対してViewModelを設計しないでください。これは、ビューを変更した場合、影響を受ける可能性のあるViewModelを調査して変更する必要があるため、コピシシティを作成するだけです。これはカスケード効果につながる可能性があります。あなたの行動は、ViewModelではなくビジネスモデルにあるべきです。そのため、ViewModelには翻訳とイベント処理のロジックだけが必要です。
  • しかし、UserControlsは画面上で自律的なユニットとして機能するはずなので、ViewModelとUserControlの比率は1:1にすることをお勧めします。
  • 他の技術的な質問については、申し訳ありませんが、私は答えがありません。しかし、Passive View、​​、およびPresentation Modelのリンクを慎重に読んでおくことをお勧めします。 UIパターンにいくつかのコンテキストを提供し、テクノロジーに中立です。

MVVMはWPFを採用することによって生じる問題を解決するのに適していますが、技術特有のパターンではありません。潜在的な哲学を理解することなく、特定の実装に深く浸った場合は、早期にいくつかの非常に大きな間違いを犯すことができます。残念なことに、MVVMは十分に文書化されたパターンではなく、皆が自分のアイデアを持っていると言ったときには正しいでしょう。

これは画期的なパターンではありませんが(数年前から別の名前で使用されていましたが)、WPFのデータバインディングは今や実用的なソリューションとなっており、新しい人気を得ています。それは良いパターンですが、それは教義ではありません。あなたが直面しているすべての "指示"に、適切な量の懐疑的な態度でアプローチします。データバインドはWPFで非常に重要な部分であることを伝えるとき

EDIT

@micahtanは正しいです。私は、WPFのデータバインディングはMVVMソリューションを可能にすると述べていますが、バインディング自体は非常に強力なので、MVVMの採用はそれを取り巻く文献よりも速く成長しています。

+0

偉大な応答。私が追加する唯一の強調点は、WPFでのデータバインディングの重要性(そして遍在性)を過小評価しないことです。ビューをVM/PMに宣言的にバインドすることは、パターンを単に動作させるものです。 – micahtan

+0

マイケルありがとう。私はあまりにも多くのことを言う必要はありません。あなたは答えが非特定の質問に非常に良いです:) 私は理解を深めるためにそのリンクをチェックします。一方、2つ以上のビューにリンクされたViewModelでより多くの意見が必要です。 もう一度ありがとうございます。 –

+0

Jesúsは、ビューあたり約1つのViewModelのことは純粋に私の意見です。それは私の経験に基づいて賢明だと思う。あなたがそれらを再利用することが理にかなっているなら、あなたは(常にあなたのために働くものを)行うべきです。残念なことに、私の意見では、UIパターンの読み方はあまりありません。 UIデザインの微妙さを知るには、実際に経験が唯一の良い方法です。私はあなたにポイントする良い本を持っていたらいいのに、まだ見つけていない。ごめんなさい。 –

1

実際にRelayCommandを使用する必要はありません。本当に必要なのは、オブジェクトにICommandインターフェイスを実装することだけです。 SoapBox Coreフレームワークでは、ICommandControlというインターフェイスを定義し、すべてのボタンViewModelsなどで実装しました。また、それを実装するために派生することができるAbstractCommandControlクラスもあります。

関連する問題