我正在使用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集合?這看起來很骯髒,而且必須有更好的方式來做到這一點。
。我真的不希望我的領域模型必須實現INotifyPropertyChanged,這是我的viewmodel以前做的事情。 – cjroebuck 2010-01-26 13:26:39
這就是當我說你需要有一些*事件機制的時候。您可以從域模型中引發一個事件(它不需要是INotifiedPropertyChanged--它可以是一個自定義事件),或者您需要明確通知Projecting Collection有關更改,以便它可以引發正確的事件。第三個選項是讓Projecting Collection輪詢基礎模型中的更改,但該路線充滿危險...... – 2010-01-26 13:39:09