2012-01-05 20 views
4

私のモデルは、1つのメインオブジェクトで構成され、ユーザはさまざまな他のオブジェクトも追加できます。追加されたオブジェクトは、メインオブジェクト内に含まれるList<object>に格納され、関連付けられた子オブジェクトです。データレイヤへのデータの受け渡し

したがって、プロジェクトが家の場合。ユーザはRoomオブジェクトの数をList<Room> RoomListに格納されている家に追加できます。次に、各RoomFurnishingsの数が再び各部屋にList<Furnishing> FurnishingsList

を格納します追加質問はMVVMのアプローチでこれを実装する方法で持つことができますか?ユーザーが新しいオブジェクトを追加すると、ViewModel内のObservableCollectionに追加されますので、ビューが更新され、同時にVMにフックされたモデルに追加されますか?または、保存またはCommmandをコミットしてモデルに渡すまで、VMに保存しますか?

私の例では、私はさまざまなエディタを持っています(それぞれはユーザーコントロールです)。そのため、ユーザーは1つのエディタを使用して家を追加、編集、削除することができます。下のレベルでは、別のエディタを使用して各部屋を編集し、Furnishingsを追加して削除します。

だから、ユーザーが部屋を「編集」するとき。私は前記Roomを含有するEditRoomModelViewを産生する。ユーザは、その部屋の家具を追加、編集、または操作する。

各コマンドでは、上記のようにModelとModelVieeのデータを同期させることをお勧めします。または、モデルに直接変更を加えて、ViewModelに注入されたModelプロパティのゲッターだけを提供させます。この方法では、オブジェクトをモデルリストに追加してもビューは更新されません。私は本当にすべてのデータが同じ状態になるように、ModelViewとModelの両方に同時にデータを追加する必要があります。

私は何を得ているのか誰にも分かりません。

答えて

3

の明示的な呼び出しによってトリガされます。一貫性を維持する方法について議論しているかのように聞こえますが、プレゼンテーションレイヤーから単純なパススルースキームを取っているのですか、ユーザーの要求に介入してロジックを持っていますか?

これが実際問題であれば、さまざまな要因があります。あなたはプレゼンテーション層でバリデーションをするのが好きですか?アプリケーションはどれぐらい複雑で、どのようにスケーラビリティが必要ですか?あなたのビューモデルは複数の場所でアクセスする必要がありますか?

だから、心の中ですべてのことを、私は個人的にこの問題にアプローチ好む方法を伝えることができます(具体的には、あなたが言及していると付け加えの問題)。私は通常、EditItemViewModel<T>ListViewModel<T>のようなジェネリックに関するユーザーの懸念を記述するビューモデルを作成したいと思っています。したがって、GUIでは、ListViewModel<Room>にバインドされたルームのリストボックスがあります。このVMは、明らかに観測可能なコレクションを表示するだけでなく、追加、削除、編集のコマンドも表示します。

だから、私の観点から、このVMがやろうとしていることをプレゼンテーション層、ビューmodellyものは、他のGUIの懸念のためのルートのリクエストです。部屋を追加するために「追加」をクリックすると、このVMは部屋を追加するために必要な画面/ウィンドウ/任意のものについて、コマンドを介して独自のVMを持つ要求を開始します。このVMは、追加リクエストを受信すると、生成されたデータ転送オブジェクトを、検証が行われるドメインおよび必要なドメイン操作に渡します。私は通常、これをサービス層を介して処理します。ここで、ドメイン操作が成功した場合、サービス層は、リストVMが変更があることを知らせるために何らかの種類の偶数コールバックまたはコールバックを発生させます。これが起こると、リストVMはそのサービスに再クエリし、それに応じて観察可能なコレクションを更新する。さて、あなたのGUIは全面的にドメインと一貫しています。

私は階層化アプローチのこのタイプを好む理由は、ビジネスロジックのすべてがGUI「下の」場所で発生し、GUIは、この発生に関与する必要がありませんということです。概念的には、GUIは単に「ここでは、ドメイン層で、これを追加したいのですが、それをすべて行い、関心のあるGUIコンポーネントにあなたが完了したときに自分自身をリフレッシュできるようにする」と言います。

私はここに記述してることは、当然、単純な、パススルー方式やVMが単にいくつかのモデルオブジェクトのプロパティを再公開する方式と比較していくつかのオーバーヘッドが発生します。しかし、個人的には、デカップリングの観点から得られる利点は価値があると思います。特に、アプリケーションをスケールアップするほどです。プレゼンテーションレイヤーコードを変更せずに、ドメインモデルの内部的なやりとりを根本的に変えることができます。

私は声明に反対
+0

ありがとうございましたErik、新しいオブジェクトをドメインレイヤーに正常に渡して、リストに保存されています。どのようにして 'List 'を表すObservableCollectionを更新できますか?サービス層は、変更を反映するためにObservableCollectionを再インスタンス化しますか? –

+0

ObservableCollectionが何であるかを知っていてもプレゼンテーションレイヤーの下に何も表示されません(つまり、それを含むWPFアセンブリへの参照はありません)。私が通常これについて通知されたGUIコンポーネントは、イベントまたはコールバックを使用しています。簡単な例として、同じサービスインスタンスを参照する2つのVMを考えてみましょう。 VM Aはルームにルームを追加するようにサービスに指示します。サービスはルームを追加するために必要な魔法を行います。終了して成功すると、VM Bが聴いているイベントが発生します。イベントが発生すると、VM Bはすべての部屋のサービスを再クエリします。 –

+0

実際の実装では、ドメイン自体が追加を処理してイベントを発生させます。このイベントはサービスが消費してVMにリレーされます。しかし、ここのアイデアはこれです - VMはオブジェクトのためのサービス(POCO/DTO)を尋ねる方法と、更新のような操作のためにそれらを渡す方法を知っています。したがって、サービスとVMの関係は、VMがオブジェクト(Get/GetAll)を要求し、操作(Add、Editなど)を要求することです。 VMは、ドメインとの同期が外れている可能性があることをVMに伝えるサービスイベントを「OnDirty」と呼びます。 VMは、再クエリの負担があります。 –

2

まず:Viewそう常にModel最初を追加した後にのみ、それはVmまたはViewにプッシュする場合を考える、あなたのDataModelの鏡です。

第二:ViewModelあなたModelViewと接続するためのブリッジであるが、それはModelが行われたのと同じ方法で構造化されなければならないことを意味するものではありません。ユーザーにすべての子コレクションを表示したい場合は、プロパティのようにそれらを公開し、​​または​​に内部の関係parent-childを構築し、それらの間の有効な関係をDataModelに持つ必要があります。

+0

「常にモデルに最初に追加した後にのみ、それがVM上またはビューにプッシュしている場合だと思う」、例えば新OrderLineViewModelインスタンスを作成OrderViewModel他のビューモデルのインスタンスを作成するビューモデルと間違って何も、ありません。 – ColinE

+0

@ColinE:useが新しいオブジェクトimoを追加すると、それが 'UI'レベルで終了することは受け入れられません。何を待っている?これは 'ウェブ開発 'ではなく、私たちは時にはデータを渡すために' Ui level'でデータを保存していたのですが、データの転送はコストがかかるので、ここでは 'deskto world'ではいつでも私のアプリケーションの生涯の現在の状態について 'モデル 'を尋ねることはできず、有効な応答もありません。 – Tigran

2

アプリケーションから、ビューモデルレイヤーがモデルを大幅に変更またはシェイプしないように見えることが記述されています。だから、私はラップされたモデルオブジェクトの様々なビューモデルのプロパティsetters/getters単純なアダプタを作成します。そうすれば、ビューモデルが変更されたときにすぐにモデルが更新されます。

しかし、「キャンセル」機能を提供する必要がある場合、つまりユーザーが一部のビューモデルを編集するためにモーダルフォームを開き、その後OKを編集するのではなくキャンセルする場合、この簡単な方法は機能しません。

モデルレイヤにコミットするタイミングは、通常は時間のかかるプロセスではないため、ほとんど違いがありません。より重要なことは、モデル状態が保持されるときです。これは、多くの場合、私は、単一の、良い答えがあるのか​​わからない永続サービスにモデルを送って保存コマンド(ファイル/クラウドなど...)

関連する問題