1

この例を見てみましょう。AViewModelにバインドされているAViewがあります。AViewは、AViewModelでACommandを実行し、それにパラメーターを渡す必要があります。問題は、ViewAにコマンドに渡すのに十分な情報がないため、ユーザーから情報を収集するために別のBViewを表示する必要があることです。VIewBが閉じられた後、ViewAはAViewModelでACommandを呼び出し、パラメーターを渡します。

このシナリオを処理する方法は?AViewがBViewと直接通信できるようにする必要がありますか、それともそうするとルールに違反しますか?

私が考えているもう1つの方法は、パラメーターなしでAViewModelでACommandを呼び出し、VIewModelAから、タスクを完了するために情報が必要であるというメッセージを送信することです。この情報は、BViewModelにバインドされているBViewを開く要求を送信するのではなく、MainPageViewModelによってキャプチャされます。BViewが閉じられると、BVIewModelは追加情報を含むメッセージを送信し、ViewModelAはこのタイプのメッセージをサブスクライブしているため、メッセージを受信して​​タスクを完了します。2つのテキストボックスに値を入力するだけではかなり複雑ですよね?:)

4

1 に答える 1

1

MVVMには3つの黄金のルールがあります: Separation, Separation & Separation:)

理由は次のとおりです。コンポーネントの自動テスト、機能の完全な分離(たとえば、独立したモジュールの場合)、モジュールの独立したチーム開発(互いにつまずかない)、および一般に、何が何をするのかを理解するのが簡単です。

2つのビューを相互接続することに答えて、存在してはならない依存関係を追加します。関心の分離は、少し複雑にするよりも重要です(そして、メッセージングモデルは、直接の相互接続を維持するよりも複雑ではないと私は主張します)。

余分なメッセージの公開/リッスンの複雑さは、無関係のコンポーネントを相互接続することの害と比較して何もありません。したがって、最後の提案は「より良い」ですが、実際には、問題全体に対するよりクリーンなアプローチを提案します。

いくつかのガイドライン:

  • ビューは、データがどこから来たのかを知る必要はなく、特定の形状のデータを表示する方法だけを知る必要があります。コマンドの実行は、VM上のICommandsへのバインディングを介して行われます。
  • ViewModelsは、特定の形状のデータとコマンドを保持する必要があります。データがどこから来ているのか、何がデータにバインドされているのかがわからないはずです。
  • モデルは実際のデータを保持しますが、それがどこで消費されるかはわかりません。
  • コントローラー(MVVMでは見落とされがちです)は、イベントの登録/プッシュ、モデルからのVM​​の入力、ICommandsでのコードの設定、ビューの可視性の制御などを行います。コントローラーは、常にメモリにとどまるために実際に必要な唯一のものであり、非常にスリムです(ほとんどの場合)コードと少しのデータ)。

基本的に、MVVMパターン(MVCVM?)にコントローラーを追加することをお勧めします。アプリ/モジュールはコントローラーを作成して初期化します。コントローラーはイベントをサブスクライブし、アプリケーションのロジックを提供します。

このパターンを試して、多くのビュー、ViewModel、およびモデルを操作することがいかに簡単になるかを確認してください。使用している言語やフレームワークについては言及されていないため、例として具体的な提案をすることはできません。

于 2012-05-10T08:41:01.570 に答える