Я просматриваю некоторые статьи о MVVM, в основном это и это .
Мой конкретный вопрос: как передать изменения модели из модели в модель просмотра?
В статье Джоша я не вижу, чтобы он этим занимался. ViewModel всегда запрашивает у модели свойства. В примере Рэйчел у нее есть реализация модели INotifyPropertyChanged
и она вызывает события из модели, но они предназначены для потребления самим представлением (см. Ее статью / код для более подробной информации о том, почему она это делает).
Нигде я не вижу примеров, когда модель предупреждает ViewModel об изменениях свойств модели. Меня это беспокоит, что, возможно, это не сделано по какой-то причине. Есть ли шаблон для предупреждения ViewModel об изменениях в Модели? Это может показаться необходимым, поскольку (1) возможно существует более 1 ViewModel для каждой модели, и (2) даже если существует только одна ViewModel, некоторые действия с моделью могут привести к изменению других свойств.
Я подозреваю, что могут быть ответы / комментарии в форме «Зачем вам это нужно?» комментарии, так что вот описание моей программы. Я новичок в MVVM, поэтому, возможно, весь мой дизайн ошибочен. Кратко опишу.
Я программирую что-то более интересное (по крайней мере, для меня!), Чем классы «Клиент» или «Продукт». Я программирую блэкджек.
У меня есть представление, которое не имеет никакого кода и просто полагается на привязку к свойствам и командам в модели представления (см. Статью Джоша Смита).
Хорошо это или плохо , но я придерживался мнения, что Модель должна содержать не только классы, такие как PlayingCard
,, Deck
но и BlackJackGame
класс, который сохраняет состояние всей игры и знает, когда игрок обанкротился, дилер должен взять карты и текущий счет игрока и дилера (меньше 21, 21, перебор и т. д.).
Из BlackJackGame
я раскрываю такие методы, как «DrawCard», и мне пришло в голову, что при отрисовке карты такие свойства, как CardScore
, и, IsBust
должны быть обновлены, и эти новые значения передаются в ViewModel. Возможно, это ошибочное мышление?
Можно было бы подумать, что ViewModel вызывал DrawCard()
метод, поэтому он должен знать, что нужно запрашивать обновленную оценку и выяснять, разоряется он или нет. Мнения?
В моей ViewModel у меня есть логика, позволяющая захватить реальное изображение игральной карты (в зависимости от масти, ранга) и сделать его доступным для просмотра. Модель не должна беспокоиться об этом (возможно, другая ViewModel будет просто использовать числа вместо изображений игральных карт). Конечно, возможно, кто-то скажет мне, что Модель не должна даже иметь концепции игры в Блэкджек, и что это следует обрабатывать в ViewModel?
OnBust
, и виртуальная машина может подписаться на него. Думаю, вы также можете использовать подход ИЭА.