2011-02-02 80 views
5

我正在尋找一些關於如何解決此刻正在擾亂我們的問題的建議。如何在模型更改時更新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,並將它們添加到PersonViewModelObservableCollection<AdressViewModels> AdressViewModelCollection屬性中。

在這一點上,我們可以使用此代碼在視圖中顯示這些ViewModels。我們可以例如顯示PersonStreetNameAdress

現在你應該怎麼做,當你刪除PersonAdress?從PersonViewModel.AdressViewModelCollection中刪除AdressViewModel將更新GUI,但實際上不允許更新基礎模型。

如果添加另一個AdressPerson型號現有的ViewModels是不會反映這種變化,因爲一旦PersonViewModel.PersonModel屬性被重新設置PersonViewModel.AdressViewModelCollection只會重建相似。

是否有一個(最好是簡單的)的方式來實現ViewModel和Model之間的這種雙向更新?或者,這可能不可取,最好以完全不同的方式處理這個問題?

我很想聽到對這個問題的不同意見!

編輯: 我想指出,我們的模型類由實體框架4.0生成的波蘇斯(見的業務對象上面的例子)。我不確定這個問題本身是否足夠清楚。我們希望將導航屬性(例如Person.Addresses)作爲ICollection<T>

回答

0

聽起來這不是級聯問題。這是模型和視圖模型之間的同步。

您將需要收聽observable collections collectionchanged事件,並提供一個實現here

我認爲你唯一的選擇是在你的模型中實現INotifyPropertyChanged,因爲實體框架沒有提供更新你的ViewModel的方法。

+0

感謝您的回答。我編輯了這個問題來澄清我們模型的起源。它們是POCO,由EF生成。雖然虛擬機可能(或可能應該)有一個`ObservableCollection `模型類本身將有一個'ICollection '因此同步只能從ViewModel工作到模型,這是正確的嗎? – 2011-02-02 14:27:55

1

你可以使用動態代理(例如Castle.Proxy)簡化事情,看看這個post想法如何實現這一點。

相關問題