Я использую сетку данных набора инструментов wpf для отображения наблюдаемой коллекции 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);
}
Значит ли это, что мне нужно поддерживать два списка, один список моделей учетных записей, а другой — наблюдаемую коллекцию моделей просмотра учетных записей? Это просто кажется неприятным, и должен быть лучший способ сделать это.