我正在尋找一些關於如何解決此刻正在擾亂我們的問題的建議。如何在模型更改時更新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; }
}
幾個業務對象(波蘇斯)。這是一個有點簡單化,但我希望這是足以讓你的想法。 UserGroup擁有一個集合個人實例和每個個人實例具有集合地址實例。
視圖模型爲用戶組 POCO也可能是這樣的:
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看起來是這樣的:
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嵌套在其中的ObserableCollections。
相應Model屬性的設置者,例如PersonViewModel.PersonModel
確實爲Person
的所有地址創建ViewModels,並將它們添加到PersonViewModel
的ObservableCollection<AdressViewModels> AdressViewModelCollection
屬性中。
在這一點上,我們可以使用此代碼在視圖中顯示這些ViewModels。我們可以例如顯示Person
的StreetName
的Adress
。
現在你應該怎麼做,當你刪除Person
的Adress
?從PersonViewModel.AdressViewModelCollection
中刪除AdressViewModel
將更新GUI,但實際上不允許更新基礎模型。
如果添加另一個Adress
到Person
型號現有的ViewModels是不會反映這種變化,因爲一旦PersonViewModel.PersonModel
屬性被重新設置PersonViewModel.AdressViewModelCollection
只會重建相似。
是否有一個(最好是簡單的)的方式來實現ViewModel和Model之間的這種雙向更新?或者,這可能不可取,最好以完全不同的方式處理這個問題?
我很想聽到對這個問題的不同意見!
編輯: 我想指出,我們的模型類由實體框架4.0生成的波蘇斯(見的業務對象上面的例子)。我不確定這個問題本身是否足夠清楚。我們希望將導航屬性(例如Person.Addresses
)作爲ICollection<T>
。
感謝您的回答。我編輯了這個問題來澄清我們模型的起源。它們是POCO,由EF生成。雖然虛擬機可能(或可能應該)有一個`ObservableCollection`模型類本身將有一個'ICollection '因此同步只能從ViewModel工作到模型,這是正確的嗎? –
2011-02-02 14:27:55