2011-02-02 11 views
5

私は現時点で私たちを悩ましている問題を解決するためのアドバイスを探しています。Modelが変更されたときにMVVMのネストされたViewModelsを更新する方法(逆も同様)

のは、我々がこれは少し単純化しているが、私はあなたのアイデアを得るよう、それは十分です願っています

public class UserGroup 
{ 
    public virtual ICollection<Person> People { get; set; } 
} 

public class Person 
{ 
    public virtual ICollection<Adress> Adresses { get; set; } 
} 

public class Adress 
{ 
    public virtual string StreetName { get; set; } 
} 

などのビジネスオブジェクト(POCOS)のカップルを持っているとしましょう。 ユーザグループには、の人物インスタンスとそれぞれインスタンスのコレクションがのアドレスのインスタンスを持っています。

のUserGroup POCOのためのViewModelはおそらく次のようになります。

public class UserGroupViewModel 
{ 
    private UserGroup userGroupModel; 

    public UserGroup UserGroupModel 
    { 
     get { return this.userGroupModel; } 

     set 
     { 
      this.userGroupModel = value; 

      this.PeopleViewModelCollection = 
       new ObservableCollection<PeopleViewModel>(); 

      foreach (Person p in this.UserGroupModel.People) 
      { 
       var personViewModel = new PersonViewModel(); 


       personViewModel.PersonModel = p; 

       this.PeopleViewModelCollection.Add(personViewModel); 
      } 
     } 
    } 

    public ObservableCollection<PersonViewModel> PersonViewModelCollection 
    { 
     get; 
     set; 
    } 
} 

POCOのためのViewModelは次のようになりますようここで、再び

public class PersonViewModel 
{ 
    private Person personModel; 

    public Person PersonModel 
    { 
     get { return this.personModel; } 

     set 
     { 
      this.personModel = value; 

      this.AddressViewModelCollection = 
       new ObservableCollection<AddressViewModel>(); 

      foreach (Address a in this.PersonModel.Adresses) 
      { 
       var addressViewModel = new AddressViewModel(); 


       addressViewModel.AddressModel = a; 

       this.AdressViewModelCollection.Add(addressViewModel); 
      } 
     } 
    } 

    public ObservableCollection<AddressViewModel> AddressViewModelCollection 
    { 
     get; 
     set; 
    } 
} 

ことがあります非常に単純ですが、私が示したいのは、ViewModelには、他のViewModelのObserableCollectionがその内部にネストされているということです。

それぞれのModelプロパティの設定子。 PersonViewModel.PersonModelは、PersonのすべてのアドレスのViewModelを作成し、PersonViewModelObservableCollection<AdressViewModels> AdressViewModelCollectionプロパティに追加します。

このコードを使用して、これらのViewModelをビューに表示することができます。例えば、 PersonAdressのを表示します。

AdressPersonを削除するとどうなりますか? PersonViewModel.AdressViewModelCollectionからAdressViewModelを削除すると、GUIは更新されますが、実際には基になるモデルを更新することはできません。既存のviewmodelsがPersonViewModel.PersonModelプロパティが再設定されるとPersonViewModel.AdressViewModelCollectionのみ再構築されるため、この変更を反映するつもりはありませんPersonモデルに別のAdressを追加した場合と同様に

ViewModelとModelの間でこの双方向の更新を実現する方法はありますか?あるいは、これはお勧めできませんし、この問題をまったく別のやりかたで処理する方が良いでしょうか?

私はこの問題について意見を異にしたいと思います!

EDIT: 私は、我々のモデルクラスは、Entity Frameworkの4.0によって生成され、POCOS(上記のビジネスオブジェクトの例を参照)されていると述べているしたいと思います。それが質問自体にはっきりしているかどうかはわかりません。ナビゲーションプロパティ(例:Person.Addresses)をICollection<T>として公開したいと考えています。

答えて

0

カスケードではないように聞こえます。これは、モデルとビューモデルの同期です。

observable collections collectionchangedイベントをリッスンする必要があります。実装はhereです。

エンティティフレームワークがViewModelを更新する方法を提供していないため、唯一の選択肢は、モデルにINotifyPropertyChangedを実装することだと思います。

+0

あなたの答えをありがとう。私はモデルの起源を明らかにするために質問を編集しました。それらはPOCOであり、EFによって生成されます。 VMは 'ObservableCollection を持つことができますが(おそらくそうでなければなりません)、モデルクラス自体は' ICollection 'を持つため、ViewModelからModelへの同期は正しく機能しますか? –

1

動的プロキシを使用して物事を簡素化することができます(例:Castle.Proxy)。postをご覧ください。

関連する問題