2009-05-30 7 views
2

ViewModelはビューからモデルを抽象化し、プレゼンテーション用のものを処理するロジックを追加する必要があることを理解しています。MVVMエキスパートはMVVMとDataformについてあなたの意見が必要です

私の質問は:

どのように私は一度に注文と詳細については、ユーザーの入力を処理するために仮定されたデータ形式を作成します。 注文を入力するフィールドと1つの詳細のフィールドが表示されます。

マイモデルには、OrderDetailsのリストを含むオーダーのオブジェクトがあります。

私のOrderEntryFormのViewModelはどのように見えますか?

私はOrderViewModelとOrderDetailViewModelを持ち、 私のOrderEntryFormにはOrderViewModelとOrderDetailViewModelのプロパティが含まれていますか? (ViewModelsをネストしていますか?) この場合、検証はどのように処理されますか?検証はモデルに近づくはずですから? 特に私がRIA-Serviceで作業しているとき... ViewModelに入れても意味がありませんか?

モデルをViewModelからどれだけ抽象化しますか? 例:

private DateTime _OrderDate; 
     public DateTime OrderDate 
     { 
      get { return _OrderDate; } 
      set 
      { 
       if (_OrderDate != value) 
       { 
        _OrderDate = value; 
        OnPropertyChanged("OrderDate"); 
       } 
      } 
     } 

これは私がモデルのプロパティにViewModelに-プロパティをマッピングする必要が意味するであろう。

public DateTime OrderDate 
     { 
      get { return Model.OrderDate; } 
      set 
      { 
       if (Model.OrderDate != value) 
       { 
        Model.OrderDate = value; 
        OnPropertyChanged("OrderDate"); 
       } 
      } 
     } 

をモデルに渡すrequiereう:

この例で...こちらのモデルから検証ロジックを活用することはできません。モデルの検証ロジックへのアクセスだけでなく、カップリングを持っている...テーブルの単なる表現ではない本当の抽象化というのViewModelのを使用するWebショーのデータフォーム上の

ほとんどの例...

私が知っていると私は、この

stackoverflow.com/questions/744474/combining-net-ria-services-and-mvvm-in-silverlight-3-0

私もこれにnikhilsのブログ投稿を読んで見たが、これは、データベースのテーブルからの製品のみストレートマッピング... =(

Iを処理します質問の多くを知って...

このトピックについてのあなたの意見はありますか? どのように複雑なデータフォームを扱いますか?

答えて

-1

明確にするために、VMはモデルの抽象であり、ビューのものではなく、他の方法ではありません。

複数のVMを使用して、個別のビューに対応することができます。 OrderとDetailsに対して別々のVMを必要としない場合は、すべてを含むOrderAndDetialsViewModelを持つことができ、View全体がそのままバインドされます。これは、抽象化が入ってくるところです。

モデルの検証ロジックは、ViewModelの検証ロジックとは別のものになるでしょう。どのような場合でも、検証はビューにはありません。

私はあなたの2番目の例に従っているかどうかはわかりません。どのようなモデルオブジェクトですか?あなたのVMは、それが構成されているモデルについて知っているかもしれませんが、それを直接ビューに公開することはありません。

これは多少役立ちます。あなたの投稿のうち、私が取り組まなかった部分があるかどうか、私に知らせてください。私は同じ問題を持っていた:-(安っぽい方法でそれを実装し終わるいる

+0

は、第二のオプションは、入力されたViewModelにやモデル – silverfighter

+0

を受け取るコンストラクタのいずれかを意味するだろうなど、OrderDetailは、追加の子供がいた場合など想像し、複雑さに応じて私はあなたの声明は、 "VMはモデルの抽象であり、ビューではない"と誤解を招く/混乱していると思います。ビューモデルは基本的にビューのモデル(「抽象化」)です。それはビューのモデルではありません。 fowlersを確認するプレゼンテーションモデルのパターン – Schneider

0

クリス、(2 vieModelsビューあたり1が、子ビューに親を渡す...悪いもの)。単一のViewModelを生成しますが、子ビューでのDataContextに詳細エンティティを渡す

  • (このディテールエンティティはありません:私は、私は試してみるだろう次回ということを学ぶ私のエラーから

    プロキシ生成エンティティと一致するには、おそらくそのエンティティのコンテナです)。

  • シングルトンコントローラクラスを生成する:このクラスはビューに公開されず、ビューに対してトランスペアレントになります。詳細ビューモデルはDALに行くのではなく、その依存データをコントローラに要求します。

    これがクリーンな解決策になるかどうかわからない場合は、試しに失敗してください:)。

    私はあなたに同意します...この種のシナリオでは実際のサンプルはありません。

    あなたはどう思いますか?

    おかげ ブラウリオ

    PS:検証については、我々は我々自身のスーパーエンティティを作成した場合、我々は検証が定義することができ、私の場合、私は部分的な例を使用してエンティティを拡張するだけでなく試してみましたが、その後、私が持っていることができますエンティティmyPhoneNumberDetailを私の特別なバリデーションと共に使用します。

0

私は個人的に厳しい規則はないと思います...よく、実用的です。

実際には、ビューモデルはモデルであり、データモデルもモデルです。両方ともUIから独立したクラスであり、プロパティとしての表面状態、メソッドとしての操作、およびイベントとしての通知です。私の心の中で私が考えるのは、それがどれほど一般的であるかということです。特定のビューに最適化されたビューモデルに対して、複数のビューにわたって一般的に使用可能なモデルがあります。

私は抽象化のために個人的に決して抽象化しません。私はすべてのモデルプロパティのトップレベルプロパティを覆うことはありませんし、基になるモデルに委任することによって実装します。これにより作業が増加します。テストするコードの量が増えます。実際に追加するロジックがある場合は、そのモデルモデルに公開して適切な場合に委譲するビューモデルのプロパティが存在します。モデルの計算されたプロパティとしてビューモデルとデータモデルが両方のモデルであることを公開することが合理的であるか適切であるかどうかを尋ねています。

DALタイプを直接浮上する限り、それは私の心の中では幾分直交しています。DALをどのように抽象化したいのか、DALタイプがどれほど有益であるかなど、他の要因に依存します。たとえば、DALタイプに多数の外部キーがある場合、プレゼンテーションモデルの同等物または投影法がある場合は、いくつかの非正規化が行われました。時には、セキュリティがプレゼンテーションモデル/投影を書く理由かもしれません。私はクライアントに電子メールアドレスを送信する代わりに、代わりに電子メールアドレスの表現をしたいと思っています。

私のサンプルでは、​​DAL型を直接使用して、単純化し、単一のサンプルに多数の概念を持たないようにしました。私は、プレゼンテーションモデルと投影についてブログに書きたいと思います。同時に、プレゼンテーションモデルのコンセプトと同時にviewmodelと.net riaサービスの投稿をミックスしたくありませんでした。

0

パターンが頻繁にあるように、それは本当に依存しています。 ViewModelは基礎となるモデルを公開することができます。すべてを隠して委任する必要があるという厳しいルールはありません。私は、LODの厳格な支持者である多くの人々に話しかけましたが、それでもUIバインディングの場合は適用されません。

このモデルがDTOであるかどうかは、さまざまな意見があります。クライアント上に存在すべき唯一のものは、純粋な投影、すなわち、サーバ上に存在するすべてのロジックを有するDTOであると信じている人もあれば、層の間のその移動するエンティティがうまくいると他の人が信じている人もいる。それは別の投稿の議論になるでしょう。 :-)

一般に

私は常に、少なくとも画面状態のために使用することができる高レベルのVMを持っている推薦する指針などOrderDetailのような子モデル、限り

、その後、もし子モデルは単にバインドしてそれを直接公開するだけで十分です。モデルがINPCを実装していない場合は、バインディングが適切に機能するようにラップする以外に、INPCを実装していないモデルよりも、通知の周りに注意が必要です。

INPCを実装していても、そのモデルに含まれていないが、ビューが機能するために必要なビュー固有の問題がある可能性があります。その場合、単純な集約を使用して、基礎となるOrderDetailを直接公開し、追加のプロパティーを追加するOrderDetailVMを作成します。例えば

IsValidのいくつかのスクリーン固有のロジックをチェックしている
public class OrderDetailViewModel 
{ 
    public OrderDetail OrderDetail {get;set;} 
    public bool IsValid {get;set;} 
} 

について

本当にカプセル化の程度に依存しますが、私は委任モデルの使用に間違いはないと思います。それは扱いにくいかもしれませんけれども

HTH グレン

+0

LOD、DTO、VM、INPC!私は最後の5分間google上の略語を見てきました;) – Grokys

関連する問題