Przeglądam kilka artykułów MVVM, przede wszystkim to i to .
Moje konkretne pytanie brzmi: Jak komunikować zmiany modelu z modelu do ViewModel?
W artykule Josha nie widzę, żeby to robił. ViewModel zawsze pyta Model o właściwości. W przykładzie Rachel ma implementację modelu INotifyPropertyChanged
i wywołuje zdarzenia z modelu, ale są one przeznaczone do konsumpcji przez sam widok (zobacz jej artykuł / kod, aby uzyskać więcej informacji o tym, dlaczego to robi).
Nigdzie nie widzę przykładów, w których model ostrzega ViewModel o zmianach właściwości modelu. Martwi mnie to, że być może z jakiegoś powodu nie jest to zrobione. Czy istnieje wzorzec ostrzegania ViewModel o zmianach w modelu? Wydawałoby się to konieczne, ponieważ (1) możliwe, że istnieje więcej niż 1 ViewModel dla każdego modelu i (2) nawet jeśli istnieje tylko jeden ViewModel, niektóre działania na modelu mogą spowodować zmianę innych właściwości.
Podejrzewam, że mogą pojawić się odpowiedzi / komentarze w formularzu „Dlaczego chcesz to zrobić?” komentarze, więc oto opis mojego programu. Jestem nowy w MVVM, więc być może cały mój projekt jest wadliwy. Pokrótce to opiszę.
Programuję coś ciekawszego (przynajmniej dla mnie!) Niż klasy „Klient” czy „Produkt”. Programuję BlackJack.
Mam widok, który nie ma żadnego kodu i po prostu opiera się na powiązaniu z właściwościami i poleceniami w ViewModel (zobacz artykuł Josha Smitha).
Na dobre lub na złe przyjąłem postawę, że Model powinien zawierać nie tylko takie klasy, jak PlayingCard
, Deck
ale także BlackJackGame
klasę, która utrzymuje stan całej gry i wie, kiedy gracz przegrał, krupier musi dobrać karty i jaki jest aktualny wynik gracza i krupiera (mniej niż 21, 21, przegrana itp.).
Od BlackJackGame
I narazić metod, takich jak „drawcard” i dotarło do mnie, że gdy karta jest rysowany, właściwości, takich jak CardScore
, i IsBust
powinny zostać zaktualizowane i te nowe wartości przekazywane ViewModel. Może to błędne myślenie?
Można przyjąć postawę, że ViewModel nazwał tę DrawCard()
metodę, więc powinien wiedzieć, aby poprosić o zaktualizowany wynik i dowiedzieć się, czy jest popiersie, czy nie. Opinie?
W moim ViewModel mam logikę, aby pobrać rzeczywisty obraz karty do gry (na podstawie koloru, rangi) i udostępnić go do widoku. Model nie powinien się tym przejmować (być może inny ViewModel użyłby po prostu liczb zamiast obrazów kart do gry). Oczywiście, być może niektórzy powiedzą mi, że Model nie powinien mieć nawet koncepcji gry w blackjacka, a to powinno być obsługiwane w ViewModel?
OnBust
, a maszyna wirtualna może je subskrybować. Myślę, że możesz również zastosować podejście IEA.