5

この質問は、この古い質問のフォローアップであり、未解決の質問というよりも確認です。

私の ViewModel インスタンスには、Model のプライベート インスタンスがあります_modelInst
ViewModel は、編集中にモデルのデータに排他的にアクセスできます (したがって、モデルは INotifyPropertyChanged を実装する必要はありません)。

ビューからモデルデータを編集する方法を思いついたのは、次の 3 つの方法です。

  1. 単純な値フィールドなど、Model インスタンスで直接取得/設定する
    これは 簡単に実装できます...
    return _modelInst.fieldname;
    _modelInst.fieldname = value;

  2. ViewModel インスタンスを作成し、親のデータ構造を操作します (
    例: structs のようなより複雑なオブジェクト タイプの場合)。

    • その型の新しい ViewModel を作成します。
      ViewModel は、親とそのフィールド名を認識しています。
    • それを ContentControl+DataTemplate に表示する
    • 取得/設定:
      パラメータとしてフィールド名を持つ親のメソッドを介して、
      1 つのフィールドのみが変更された場合でも元のオブジェクト全体を上書きします

    _modelInstこれは、これらの構造のそれぞれに対して、親によって実装された新しいインターフェイスを作成することを意味します (更新ルーチンは で動作します)。


  3. 親クラス内のクラス (のリスト) など、親のデータ構造を直接認識せずに ViewModel インスタンスを作成する

    • クラスごとに新しい ViewModel を作成する

    • 経由で親に更新指示を送信する

      1. コマンド
      2. メッセージ
      3. リフレクション (親
        は、インスタンスを格納されているすべての子と比較することにより、関数を呼び出した子を認識します)

      これらはすべて、編集可能なモデルのすべてのフィールドに対して関数を作成し、実装するのが非常に面倒です。
      これは、モデルのほぼすべてのフィールドを意味します...

(4.) リフレクションのみを介して機能する一般的な ViewModel を作成できます。ここで、各サブオブジェクトはその親とそのフィールド名 (リストの場合は +index) を認識します。
ルートのロジックのみがモデルに干渉します。
しかし、その解決策には、フィールドへのパスを 内に格納する手段も必要です_modelInst

これを達成するための他の(より簡単な)方法はありますか?
MVVM の原則を (また) 誤解していましたか?
MVVM は大規模な階層データ構造の操作に適していますか?

4

2 に答える 2

2

これらのリソースが役立つことを願っています。MVVM と、ビュー モデルを使用してオブジェクト グラフ/階層を表現する方法を学んだので、それらは私をかなり助けてくれました。

  1. 編集可能オブジェクト アダプタ
  2. 編集可能なコレクション アダプタ
  3. マイクロモデル
于 2011-07-15T20:59:34.213 に答える
0

これは優れた質問であり、MVC パターンに付属する良い答えがあるとは思えません。

ViewModel は、マップ先のモデルに子がない場合にうまく機能します。

ただし、モデルに子がある場合は、次のようになります。

お客様

        -->Order

        -->Country

(Country が Customer の子オブジェクトであると想像してください) デザイン パターンの種類が崩壊します。

私が見つけた最善の方法は、継承を使用して、viewmodel ロジックが必要な子のみを選択的に公開することです。それ以外の場合は、継承によって取得されるビューのモデルのプロパティにアクセスするだけです。

public class CustomerView : Customer //Customer (モデル) から継承 {

public CustomerView(Customer customer)
{
      this.FirstName = customer.FirstName
      //etc..

      //Only if you need it, that is if you have some display-specific
      //logic relating to country for a given view, you create
      //a CountryView class that inherits from Country and gets populated
      //by an instance of it as well
      this.CountryView = new CountryView(customer.Country)
}

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it.

public string DisplayColor
{
    if(base.FirstName == "Joe")
    {
        return "red";
    }
    return "";
}

}

これは、孫を扱うときに厄介になります。誰かがより良い解決策を持っているなら、私はそれを聞きたいです.

ありがとう

于 2015-10-05T07:18:58.897 に答える