Как сохранить наборы viewmodels и моделей в синхронизации

Я использую wpf инструментарий datagrid для отображения заметного набора AccountViewModels.

Вещь состоит в том, когда я удаляю учетную запись из сетки, я хочу, чтобы удаленный из ObservableCollection - дал пользователю визуальную обратную связь, но я хочу, чтобы базовый список моделей Account остался тем же, только с набором флага 'IsDeleted' на модели Account.

Тогда каждый раз, когда изменения фиксируются, мой сервис знает который учетные записи добавить/обновить или удалить в базе данных.

Я подписываюсь на событие CollectionChanged:

AccountViewModels.CollectionChanged += AccountsChanged;

и затем установка модели viewmodel isdeleted отмечает к истинному каждый раз, когда что-то удалено:

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? Это просто кажется противным и должен быть лучший способ сделать это.

9
задан cjroebuck 26 January 2010 в 11:29
поделиться

2 ответа

Я не думаю, что вы можете сделать это лучше с помощью наблюдательного элемента, так как этот класс имеет свой собственный внутренний список объектов.

Тем не менее, если вы реализуете пользовательскую коллекцию, которая реализует InotifyCollectionChanged и InotifyPropertyChanged, вы можете позволить ему обернуть и отфильтровать свою коллекцию источника.

Он может фильтровать на флаге Isdelet, чтобы они не были видны.

Всякий раз, когда пользователь удаляет элемент, вы можете напрямую модифицировать модель домена напрямую, установив флаг ISDELETELED для TRUE. Тем не менее, вам все равно понадобится механизм в совокупности, чтобы иметь возможность поднять соответствующие события, но с таким подходом у вас есть только одна коллекция предметов.

Пользовательская коллекция будет просто прогнозной моделью по модели домена, с дополнительными событиями.

3
ответ дан 4 December 2019 в 23:39
поделиться

Вы можете найти пример здесь: http://blog.lexique-du-net.com/index.php?post/2010/03/02/MV-VM-How-to-keep-collections- of-ViewModel-and-Model-in-sync

Надеюсь на эту помощь

3
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: