2010-01-26 98 views
9

我正在使用wpf工具包datagrid顯示AccountViewModels的可觀察集合。如何保持視圖模型和模型的集合同步

事情是當我從網格中刪除一個帳戶,我希望它從ObservableCollection中刪除 - 給用戶視覺反饋,但我希望帳戶模型的底層列表保持不變,只是用'IsDeleted '帳戶模型上設置的標誌。

然後,每當更改提交,我的服務知道哪些帳戶添加/更新或刪除數據庫中。

林訂閱到CollectionChanged事件:

AccountViewModels.CollectionChanged += AccountsChanged; 

,然後不管什麼時候被移除的ViewModels'模式請將isDeleted標誌設置爲true:

private void AccountsChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (AccountViewModel model in e.NewItems) 
      { 
       model.PropertyChanged += accountPropertyChanged; 
       model.Account.IsNew = true; 
      } 
     } 
     if (e.OldItems != null) 
     { 

      foreach (AccountViewModel model in e.OldItems) 
      { 
       model.PropertyChanged -= accountPropertyChanged; 
       model.Account.IsDeleted = true; 
      } 
     } 
    } 

,但顯然這再從觀察到的中刪除採集。所以當我提交更改時,將不會有IsDeleted標誌設置的帳戶。即它們將已被移除。

foreach (AccountViewModel acc in m_ViewModel.AccountViewModels) 
     { 
      WorkItem workItem = null; 
      if(acc.Account.IsNew) 
       workItem = new WorkItem("Saving new account: " + acc.AccountName, "Saving new account to the database",() => Service.AddAccount(acc.Account)); 
      else if (acc.Account.IsDeleted) 
       workItem = new WorkItem("Removing account: " + acc.AccountName, "Setting account inactive in the database",() => Service.RemoveAccount(acc.Account)); 
      else if(acc.Account.IsDirty) 
       workItem = new WorkItem("Updating account: " + acc.AccountName, "Updating account in the database",() => Service.UpdateAccount(acc.Account)); 

      workItems.Add(workItem); 

     } 

那麼這是否意味着我需要維護兩個列表,一個賬戶模型列表和另一個可觀察的accountviewmodels集合?這看起來很骯髒,而且必須有更好的方式來做到這一點。

回答

3

我不認爲你可以做到這一點任何更好的ObservableCollection,作爲類持有對象自身的內部列表。

但是,如果實現了實現INotifyCollectionChanged和INotifyPropertyChanged的自定義集合,你可以讓它包裝和過濾你的源集合。

它可以在旗請將isDeleted過濾,使這些不可見。

每當用戶刪除的項目,您可以直接修改域模型,請將isDeleted標誌設置爲true。但是,您仍然需要一個事件機制來提升適當的事件,但是通過這種方法,您只有一個項目集合。

自定義集合將僅僅是在域模型投影,與添加的事件。

+0

。我真的不希望我的領域模型必須實現INotifyPropertyChanged,這是我的viewmodel以前做的事情。 – cjroebuck 2010-01-26 13:26:39

+0

這就是當我說你需要有一些*事件機制的時候。您可以從域模型中引發一個事件(它不需要是INotifiedPropertyChanged--它可以是一個自定義事件),或者您需要明確通知Projecting Collection有關更改,以便它可以引發正確的事件。第三個選項是讓Projecting Collection輪詢基礎模型中的更改,但該路線充滿危險...... – 2010-01-26 13:39:09

相關問題