Я использую сетку данных wpf toolkit для отображения наблюдаемой коллекции AccountViewModels.
Дело в том, что когда я удаляю учетную запись из сетки, я хочу, чтобы она была удалена из ObservableCollection - чтобы дать пользователю визуальную обратную связь, но я хочу, чтобы базовый список моделей учетных записей оставался прежним, только с IsDeleted. флаг установлен на модели учетной записи.
Тогда, когда изменения фиксируются, моя служба знает, какие учетные записи добавить / обновить или удалить в базе данных.
Я подписываюсь на событие CollectionChanged:
AccountViewModels.CollectionChanged += AccountsChanged;
и затем установка флага модели модели 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);
}
Значит ли это, что мне нужно вести два списка, один список моделей учетных записей, а другой - наблюдаемый набор моделей accountview? Это только кажется неприятным, и должен быть лучший способ сделать это.