Slavka_online
@Slavka_online
Интересная личность

Как осуществляется связь между ViewModel и Model в MVVM?

Не могу понять одну вещь в паттерне mvvm, как должна узнавать viewmodel об изменеиях в model, к примеру у меня модель постоянно получает в фоне какое нибудь данные, и я хочу их видеть в gui, для этого мне пришлось делать открытым свойсвом observablecollection в модели и подписываться на его изменения, чтоб изменить коллекцию в ViewModel, возможно я не доконца понимаю связь этих двух сущностей.
  • Вопрос задан
  • 1994 просмотра
Пригласить эксперта
Ответы на вопрос 3
Nipheris
@Nipheris Куратор тега C#
В общем случае способ передачи нотификаций из модели во ViewModel не регламентируется паттерном MVVM. Как это лучше всего осуществлять - зависит от вашей задачи.

Возможно ViewModel будет сама знать о том, когда и в каком случае какие свойства модели изменяются и сама будет генерировать необходимые события PropertyChanged.
Возможно в модели будут специфичные для конкретной задачи ивенты (например, модель будет вызывать PlayerMoveCompleted когда игрок сделает ход), на которые будет подписана ViewModel и будет, в свою очередь, генерировать необходимые PropertyChanged.
Некоторые советуют в модели также реализовать INotifyPropertyChanged, но лично мне этот способ не нравится: во-первых, в модель начинает подмешиваться UI, что обычно нехорошо, а во-вторых - нотификация о смене значений конкретных пропертей это всё-таки задача ViewModel, и я не вижу смысла размазывать её ещё и на модель. Последняя должна содержать только специфичные для предметной области вещи.
Ответ написан
@i_light
Backend, XAML, crossplatform
Модель в MVVM не должна содержать никаких данных. Данные нужны для отображения во View, соответственно они получаются и используются во ViewModel.

Model представляет собой модель некой сущности (как правило таблицы БД) и должна состоять в основном из методов манипуляции данными.

Например:
UserModel - методы для создания, удаления, редактирования и получения одного или списка пользователей.
UserViewModel - хранение списка пользователей, либо хранение данных полей пользователя, команды для получения данных из модели, в том числе здесь могут быть и автономно запускающиеся (например по таймеру).
Ответ написан
Комментировать
@eugene73
Делайте опрос датчиков во ViewModel, методы вычислений пускай будут в Model, их нужно вызывать из ViewModel.
Ну, или если вы настаиваете на своей схеме, когда вся работа по получению и обработке данных выполняется в Model, используйте Catel. В Catel.MVVM есть атрибуты свойств [Model] и [ViewModelToModel], которые позволяют связать свойства Model и ViewModel.
Или самостоятельно реализуйте INotifyPropertyChanged в модели.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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