Как отменить редактирование к объекту с помощью MVVM?

У Вас будут проблемы с сериализацией набора, если объекты в наборе будут содержать какую-либо ссылку на другие объекты в том же наборе. Если какой-либо тип двойного указания существует, Вы заканчиваете тем, что создали мультикарту, которая не может быть сериализирована. На каждой проблеме у меня когда-либо была сериализация пользовательского набора, всегда из-за некоторой добавленной функциональности мне было нужно, который хорошо работал как часть "типичного" клиент-серверного приложения, и затем потерпел полный провал как часть потребительского серверного приложения поставщика.

18
задан jww 25 February 2017 в 02:25
поделиться

4 ответа

Проверьте интерфейс IEditableObject . Ваш класс Customer должен реализовать это, и ваши команды могут выполнять BeginEdit / CancelEdit / EndEdit в зависимости от ситуации.

12
ответ дан 30 November 2019 в 08:53
поделиться

In this article, Raul just reload the object from the DB. I guess it's less trouble than the solution Kent proposes.

    internal void Cancel(CustomerWorkspaceViewModel cvm)
    {
        Mainardi.Model.ObjectMapping.Individual dc = cvm.DataContext 
                                 as Mainardi.Model.ObjectMapping.Individual;

        int index = 0;

        if (dc.ContactID > 0 && dc.CustomerID > 0)
        {
            index = _customerCollectionViewModel.List.IndexOf(dc);
            _customerCollectionViewModel.List[index] = 
                                  _customerBAL.GetCustomerById(dc.CustomerID);
        }

        Collection.Remove(cvm);
    }
3
ответ дан 30 November 2019 в 08:53
поделиться

Вы также можете в своей ViewModel скопировать состояние модели во внутренние поля, а затем раскрыть их и установить только в модели, когда пользователь действительно совершит изменение.

Проблема может заключаться в том, что проверка на лету будет более проблематичной, если проверка зависит от обновления сущности - если это требование, вы можете создать клон модели для работы, а затем объединить клон с реальной сущностью при ее сохранении.

0
ответ дан 30 November 2019 в 08:53
поделиться

Очень простой способ, если ваш объект уже сериализуем, например, если вы используете WCF. Вы можете сериализовать исходный объект во внутреннее поле. Если ваш объект не сериализуемый, просто используйте AutoMapper , чтобы создать копию вашего объекта с помощью одной строчки кода.

Order backup = Mapper.Map<Order, Order>(order);

Когда вы обрабатываете команду CancelCommand, просто вызывайте AutoMapper в обратном порядке. Поскольку у ваших свойств уже есть уведомление об изменении, все просто работает. Возможно, вы можете комбинировать эти методы с IEditableObject, если вам нужно и вы хотите написать дополнительный код.

3
ответ дан 30 November 2019 в 08:53
поделиться
Другие вопросы по тегам:

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