私は現時点で私たちを悩ましている問題を解決するためのアドバイスを探しています。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を作成し、PersonViewModel
のObservableCollection<AdressViewModels> AdressViewModelCollection
プロパティに追加します。
このコードを使用して、これらのViewModelをビューに表示することができます。例えば、 Person
のAdress
のを表示します。
Adress
のPerson
を削除するとどうなりますか? PersonViewModel.AdressViewModelCollection
からAdressViewModel
を削除すると、GUIは更新されますが、実際には基になるモデルを更新することはできません。既存のviewmodelsがPersonViewModel.PersonModel
プロパティが再設定されるとPersonViewModel.AdressViewModelCollection
のみ再構築されるため、この変更を反映するつもりはありませんPerson
モデルに別のAdress
を追加した場合と同様に
。
ViewModelとModelの間でこの双方向の更新を実現する方法はありますか?あるいは、これはお勧めできませんし、この問題をまったく別のやりかたで処理する方が良いでしょうか?
私はこの問題について意見を異にしたいと思います!
EDIT: 私は、我々のモデルクラスは、Entity Frameworkの4.0によって生成され、POCOS(上記のビジネスオブジェクトの例を参照)されていると述べているしたいと思います。それが質問自体にはっきりしているかどうかはわかりません。ナビゲーションプロパティ(例:Person.Addresses
)をICollection<T>
として公開したいと考えています。
あなたの答えをありがとう。私はモデルの起源を明らかにするために質問を編集しました。それらはPOCOであり、EFによって生成されます。 VMは 'ObservableCollectionを持つことができますが(おそらくそうでなければなりません)、モデルクラス自体は' ICollection 'を持つため、ViewModelからModelへの同期は正しく機能しますか? –