Я переглядаю деякі статті MVVM, в першу чергу це і це .
Моє конкретне питання: Як я можу повідомити про зміни в моделі від моделі до ViewModel?
У статті Джоша я не бачу, що він це робить. ViewModel завжди запитує у Моделі властивості. На прикладі Рейчел у неї є реалізована модель INotifyPropertyChanged
та викликає події з моделі, але вони призначені для споживання самим видом (див. Її статтю / код для отримання більш детальної інформації про те, чому вона це робить).
Ніде я не бачу прикладів, коли модель попереджає ViewModel про зміни властивостей моделі. Це мене хвилює, що, можливо, це не робиться з якихось причин. Чи існує схема оповіщення ViewModel про зміни в Моделі? Це може здатися необхідним, оскільки (1) можливо, існує більше 1 ViewModel для кожної моделі, і (2) навіть якщо є лише один ViewModel, деякі дії на моделі можуть призвести до зміни інших властивостей.
Я підозрюю, що можуть бути відповіді / коментарі форми "Чому б ти хотів це зробити?" коментарі, ось ось опис моєї програми. Я новачок у MVVM, тому, можливо, весь мій дизайн несправний. Я коротко опишу це.
Я програмую щось цікаве (принаймні, для мене!), Ніж класи "Клієнт" або "Продукт". Я програмую BlackJack.
У мене є погляд, який не має коду позаду і просто покладається на прив'язку до властивостей та команд у ViewModel (див. Статтю Джоша Сміта).
На краще чи гірше, я подумав, що Модель повинна містити не лише класи, такі як PlayingCard
, Deck
але, а також BlackJackGame
клас, який підтримує стан всієї гри, і знає, коли гравець перекинувся, дилер повинен намалювати карти, і який поточний бал гравця та дилера (менше 21, 21, бюст тощо).
З цього BlackJackGame
я викриваю такі методи, як "DrawCard", і мені спало на думку, що коли малюється картка, такі властивості, як CardScore
, і IsBust
повинні бути оновлені, і ці нові значення передаються ViewModel. Можливо, це помилкове мислення?
Можна поставитись до того, що ViewModel назвав DrawCard()
метод, тож він повинен знати, щоб попросити оновлений бал і дізнатись, чи є він чи ні. Думки?
У моєму ViewModel я маю логіку схопити фактичне зображення ігрової карти (на основі костюму, ранжу) та зробити її доступною для перегляду. Модель не повинна цим займатися (можливо, інші ViewModel просто використовуватимуть цифри замість того, щоб грати на карти). Звичайно, можливо, хтось скаже мені, що Модель навіть не повинна мати концепцію гри BlackJack і з цим слід обробляти в ViewModel?
OnBust
, і VM може підписатися на неї. Я думаю, ви також могли використовувати підхід МЕА.