Шаблон MVVM в wpf - одна модель данных, несколько моделей представлений - PullRequest
3 голосов
/ 12 августа 2010

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

Первое представление: иерархические данные в древовидном представлении Второй вид: отображаемая геометрия на экране

Следуя шаблону MVVM, я реализовал классы представления модели вокруг модели данных (представление точечной модели, представление линейной модели и т. Д.). В древовидном представлении я использую иерархические шаблоны данных для правильного отображения определенных данных. Во втором представлении мне нужно отобразить текущее состояние геометрии, в настоящее время это всего лишь одна оболочка представления модели вокруг полигонального класса данных, которая перемещает все дочерние элементы и отображает их в методе onRender. В этом случае я использую несколько моделей представлений для одних и тех же данных, обе для совершенно разных целей.

При внесении некоторых изменений в древовидную модель (например, добавление точек) возникает проблема, приводящая к изменению базовой модели данных. Однако модель второго представления напрямую не наблюдает данные в представлении модели, она обновляет представление рендеринга, только если я изменяю ее классы представления модели. Есть ли какое-то элегантное решение для одновременного обновления обеих моделей представлений?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Я решил это, представив Presenter. Вот как это работает:

  1. Моя модель домена содержит некоторое представление процесса (назовите его задачей, рабочим процессом или чем-то еще). Он содержит «бизнес-логику» для реальных действий, которые вы делаете.
  2. Мой докладчик должен отобразить процесс.
  3. Он создает экземпляр ViewModel (и, при необходимости, несколько ViewModel), давая каждой ViewModel ссылку на докладчика (обратный вызов).
  4. После создания экземпляра и отображения ViewModels он передает им ссылку на модель и говорит им обновить ее состояние.
  5. ViewModels не поддерживает прямую ссылку на модель. Когда они хотят выполнить действие, они используют обратный вызов для Presenter, который был им предоставлен при создании экземпляра. Ведущий фактически выполняет действие против Модели (процесс, задача и т. Д.).
  6. После выполнения действия Presenter снова передает ссылку на недавно обновленную модель всем моделям представления, инструктируя их обновить свое состояние.

Это позволяет синхронизировать их все, и ViewModel не нужно знать ни о каких других моделях ViewModel. Все мои Иерархические ViewModel реализуют интерфейс IViewModelWithChildren, который предоставляет свойство IEnumerable<IViewModel>, которое позволяет Presenter обходить любое заданное дерево ViewModel и уведомлять их все, если оно имеет ссылку на корневой ViewModel.

Мне также это нравится, потому что он направляет все действия пользователя через единую точку (обратный вызов Presenter), и я могу внести туда определенные проблемы. Например, если в логике модели происходит необработанное исключение, я могу поймать его в этот момент и создать прекрасный MessageViewModel для отображения пользователю.

0 голосов
/ 12 августа 2010

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

Если вы хотите отсоединить ее дополнительно, вы можете использовать агрегатор событий, доступный в проекте Prism.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...