проектирование модели в MVVM и WPF и управление состоянием

#wpf #mvvm #viewmodel

#wpf #mvvm #viewmodel

Вопрос:

В моем приложении WPF я использую MVVM. Я считываю из XML-файла, десериализую его в объектную модель и сохраняю в памяти.

XML-файл-> BusinessObjectModel (модель)-> ViewModel

Всякий раз, когда viewmodel понадобится модель, я предоставлю ее из памяти.Моя проблема в том, что когда я использую элементы модели в представлениях, это обновляет модель в памяти (очевидно!). Я не хочу этого делать, я хочу, чтобы модель обновлялась только тогда, когда пользователь нажимает OK в представлении (или диалоговом окне). Как это обычно достигается? Должен ли я предоставлять viewmodel только клон модели, а не исходную ссылку?

Ответ №1:

Редактирование клона объекта model решило бы проблему, как вы и предлагали.

Другим подходом было бы заставить привязки свойств использовать UpdateSourceTrigger из Explicit. После нажатия кнопки Сохранить вы должны программно вызвать UpdateSource для каждого выражения привязки. Для этого требуется некоторый дополнительный код, который должен находиться в коде представления, поскольку это код, который манипулирует элементами пользовательского интерфейса.

Также рассмотрите возможность наличия свойства на вашей виртуальной машине для каждого свойства, отображаемого в представлении, где поле поддержки свойства виртуальной машины не является соответствующим свойством обернутого объекта модели. Когда пользователь нажимает Сохранить, вы можете назначить каждое свойство виртуальной машины объекту модели. Естественно, элементы управления в представлении будут привязаны к свойствам виртуальной машины, а не к свойствам модели. Это фактически похоже на создание клона, без дополнительного багажа поддержки клонирования на уровне модели.

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

Комментарии:

1. Отлично, я остановлюсь на третьем предложении (наличие свойства в виртуальной машине, которое не принадлежит модели), поскольку это звучит проще всего. Спасибо!