34

説明する最良の方法は、例を使用することです。

これがモデルです

public class Person 
{
    public int age;
    public string name;
}

これはビューモデルです

public class PersonVM
{    
}

私の質問は次のとおりです
。VM はその人物をデータ テンプレートに公開するか、モデルのプロパティを自分のプロパティでカプセル化する必要がありますか?

4

4 に答える 4

22

ビュー モデルは独自のプロパティを宣言し、モデルの詳細をビューから隠す必要があります。これにより、最大限の柔軟性が得られ、ビュー モデル タイプの問題がモデル クラスに漏れるのを防ぐことができます。通常、ビュー モデル クラスは委任によってモデルをカプセル化します。例えば、

class PersonModel {
    public string Name { get; set; }
}

class PersonViewModel {
    private PersonModel Person { get; set;}
    public string Name { get { return this.Person.Name; } }
    public bool IsSelected { get; set; } // example of state exposed by view model

    public PersonViewModel(PersonModel person) {
        this.Person = person;
    }
}

覚えておいてください: モデルは、それを消費しているビュー モデルについて何も認識してはならず、ビュー モデルは、それを消費しているビューについて何も認識してはなりません。ビューは、バックグラウンドに潜むモデルについて何も認識しない必要があります。したがって、ビュー モデルのプロパティの背後にあるモデルをカプセル化します。

于 2009-07-11T20:36:48.647 に答える
6

これに対する興味深い解決策が、MSDN ボリューム 25 で Robert McCarter によって提案されました。

http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

彼は動的ビュー モデルを使用して、すべてのモデル プロパティのプロキシを回避しながら、モデルの上にレイヤーを提供します。

問題空間が高いパフォーマンスを必要としない場合 (ダイナミクスはパフォーマンス ヒットを引き起こします)、これは優れたソリューションです。ビューはモデルについて何も知る必要はありませんが、ビュー モデルは「そのまま」提供されるプロパティをプロキシする必要はありません。ビューまたはモデルを変更せずに、いつでもプロパティをビュー モデルに追加して、モデル プロパティをラップできます。詳細については、記事をお読みください。

于 2011-01-05T14:52:39.243 に答える
5

任意のモデルの ViewModel を持つことは、それよりも悪い可能性があります。モデルの階層構造や単純なコレクションがある場合はどうなるでしょうか? その場合、すべてのモデルを繰り返し処理し、モデルごとに ViewModel インスタンスを構築し、notify-change イベントまたはその他のイベントを登録する必要があります。私見、これは完全に正気ではなく、不合理です。DaniCE が言ったように、多くのコードと大きな頭痛の種になるでしょう。

于 2010-04-18T13:52:22.810 に答える