2016-08-15 11 views
0

MVVMとモデル、ビューモデル、ビューの違いについてよく知っています。答えが見つからないのは、実行時にモデルを更新する方法だけです。私が何を意味するかをお見せするための簡単な例:実行時にmvvmを使用してモデルを更新する

のは、私は、グラフを表示し、データベースに保存することができるアプリケーションがあるとしましょう。

は私が持っているモデル

public class Session { 
    public Document Doc { get; set; } 
} 
public class Document { 
    public string Name { get; set; } 
    public Point[] GraphPoints { get; set; } 
} 

私は、それらをパラメータとして渡すことによって、彼らののviewmodelsにそれらを接続することができますとき

public class SessionViewModel{ 
    private readonly Session _session; 
    public SessionViewModel(Session session) 
    { 
     this._session = session; 
    } 
} 
public class DocumentViewModel{ 
    private readonly Document_document; 
    public SessionViewModel(Document document) 
    { 
     this._document = document; 
    } 
} 

public class ShellViewModel { 

    public SessionViewModel SessionVm { get; set; } // <-- Bind in view 
    public DocumentViewModel DocumentVm { get; set; } // <-- Bind in view 
    private Session _session; 

    public ShellViewModel() 
    { 
     _session = new Session(); 
     session.Doc = new Document(); 

     SessionVm = new SessionViewModel(session); 
     DocumentVm = new DocumentViewModel(session.Doc); 
    } 
} 

問題は私が決める私のアプリケーションのライフサイクルの途中で表示されますdocumentの値を変更します。たとえば:

public void OnNewDocumentLoaded(Document newDoc) 
{ 
    _session.Doc = newDoc; 
} 

_session.Docを変更しましたが、すべてのDocumentViewModelは、コンストラクタに渡されたdocumentの独自のインスタンスを持っているので、私はモデルを変更していても、私のviewmodelは同じまま。

モデルは、フレームワークについて知っているべきではないと私の理解から、これは悪いアプローチであるため、また、私は、私のモデル内INotifyPropertyChangedを使用する必要はありません。また、私は自分のモデルをPCLプロジェクトに保存しているので、私のモデルにINotifyPropertyChangedを実装することさえできません。

+1

私はモデルにINotifyPropertyChangedを実装していますが、これはかなり典型的なようです。 http://stackoverflow.com/questions/6922130/in-mvvm-model-should-the-model-implement-inotifypropertychanged-interfaceを参照してください。私は、ダーティー/セーブ/ロードを管理し、変更をVMに通知するモデルにPOCOとデータオブジェクトをラップします。このよう – Joe

+0

:あなたは何か他のものへのWPF変更したいとしましょうのでhttp://blog2.rees.biz/_/rsrc/1271023681400/Home/mvvmpattern/wpflobmvvm-thumb1.png – Joe

+0

私は、これは悪い習慣だと思います。モデルを修正する必要があります。また、私はプラットフォームに依存しないPCLプロジェクトに自分のモデルを保存すると言った。 – FCin

答えて

0

私はMVVMのアプローチを理解しているので、モデルにはビューモデルが関連付けられていてはなりません。代わりに、ビューにはビューモデルが関連付けられている必要があります。あなたのビューモデルの中には、アプリケーションのモデルからオブジェクトを持つことができます。あなたのビューモデル内では、INotifyPropertyChangedを実装するべき場所です。これらのメソッドは、変更したオブジェクトを制御し、ビューとビューモデルの間でバインディングが発生する可能性があります。

+0

"モデルは、それらに関連付けられているビューモデルを持ってはいけません"とはどういう意味ですか?私は、すべてのモデルに対応するビューモデルとビューが必要であると考えました。また、どのようにモデルやビューモデルを変更できますか? – FCin

関連する問題