Как мне сохранить согласованность между моделью и моделью представления в шаблоне MVVM? - PullRequest
8 голосов
/ 03 февраля 2009

Постановка задачи

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

  • Модель : классы C #, автоматически созданные из xsd.exe

  • View-Model : представление модели для удобства просмотра.

  • Просмотр : Xaml и пустой код позади

Я понимаю, как View-Model может сделать привязку View легкой. Однако разве это не оставляет семантику View-Model <-> Model очень неловкой? Xsd.exe создает классы C # с массивами для нескольких элементов XML. Однако на уровне V-VM вам нужны Наблюдаемые Коллекции.

Вопросы:

Значит ли это, что я должен сохранять два совершенно разных типа коллекций, представляющих одни и те же данные в согласованности?

Каковы наилучшие практики для поддержания согласованности между моделью и моделью представления?

Ответы [ 4 ]

6 голосов
/ 03 февраля 2009

Я не большой эксперт, но я думаю, что это так, да. Общая идея действительно состоит в том, чтобы распространять изменения между представлением и viewModel через Binding, а затем между ViewModel и Model через события (в направлении Model -> ViewModel) или зависимость (в другом направлении).

Я не знаю, насколько это стандартно, но я понимаю, что MVVM заключается в том, что ViewModel должна содержать ссылку на модель, чтобы при изменении пользователем представления ViewModel вызывал соответствующий код модели. С другой стороны, Модель должна вызывать события при изменении, и ViewModel должна обновлять себя соответствующим образом (ViewModel является наблюдателем модели).

2 голосов
/ 03 февраля 2009

Вам нужно явно ObservableCollections в модели представления, так что, да, вам понадобятся два совершенно разные типы коллекций в модели и в модели представления.

Я написал статью о том, как отменить / повторить в MVVM, где вы можете найти возможное решение этой проблемы. Он использует то, что я называю MirrorCollection : производный класс ObservableCollection автоматически получает свои элементы из списка (списка модели).

Я думаю, что это интересное решение, статьи вы можете найти здесь

Часть 1. Использование шаблона Viewmodel для обеспечения отмены / повтора в WPF

Часть 2: списки Viewmodelling (вот определение MirrorCollection)

2 голосов
/ 03 февраля 2009

@ Значит ли это, что я должен сохранять два совершенно разных типа коллекций, представляющих одни и те же данные в согласованности?

Я думаю, что да. Это довольно скучно, но работает довольно хорошо. Надеемся, что в будущем у нас будет также генератор кода для создания детали ViewModel.

Карл работает над этим: http://karlshifflett.wordpress.com/mvvm/

0 голосов
/ 16 октября 2013

Отображение событий или делегатов в модели и привязка к ним в ViewModel, когда когда-либо значения в модели изменяются, уведомляют viewmodel через событие или делегатов, а из Viewmodle можно обновить пользовательский интерфейс.

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

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