MVVM in WPF – Come avvisare ViewModel delle modifiche in Model … o dovrei?

Sto esaminando alcuni articoli MVVM, principalmente questo e questo .

La mia domanda specifica è: come posso comunicare le modifiche del modello dal modello al ViewModel?

Nell’articolo di Josh, non vedo che lo faccia. ViewModel richiede sempre al modello proprietà. Nell’esempio di Rachel, ha il modello implementare INotifyPropertyChanged e solleva eventi dal modello, ma sono destinati al consumo dalla vista stessa (vedere il suo articolo / codice per maggiori dettagli sul perché lo fa).

Da nessuna parte vedo esempi in cui il modello avverte il ViewModel delle modifiche alle proprietà del modello. Questo mi ha preoccupato che forse non è stato fatto per qualche motivo. C’è un modello per avvisare il ViewModel delle modifiche nel modello? Sembrerebbe necessario in quanto (1) presumibilmente ci sono più di 1 ViewModel per ogni modello, e (2) anche se c’è un solo ViewModel, alcune azioni sul modello potrebbero comportare la modifica di altre proprietà.

Sospetto che potrebbero esserci risposte / commenti sul modulo “Perché vorresti farlo?” commenti, quindi ecco una descrizione del mio programma. Sono nuovo di MVVM quindi forse tutto il mio design è difettoso. Lo descriverò brevemente.

Sto programmando qualcosa che è più interessante (almeno per me!) Delle classi “Cliente” o “Prodotto”. Sto programmando BlackJack.

Ho una vista che non ha alcun codice dietro e si basa solo sul binding di proprietà e comandi nel ViewModel (vedi l’articolo di Josh Smith).

Nel bene o nel male, ho preso l’atteggiamento secondo cui il Modello dovrebbe contenere non solo classi come PlayingCard , Deck , ma anche la class BlackJackGame che mantiene lo stato dell’intero gioco, e sa quando il giocatore è fallito, il dealer deve pescare carte, e quale sia il punteggio attuale del giocatore e del mazziere (meno di 21, 21, busto, ecc.).

Da BlackJackGame espongo metodi come “DrawCard” e mi è venuto in mente che quando una carta viene disegnata, le proprietà come CardScore e IsBust devono essere aggiornate e questi nuovi valori comunicati al ViewModel. Forse è sbagliato pensare?

Si potrebbe prendere l’atteggiamento secondo cui ViewModel ha chiamato il metodo DrawCard() per cui dovrebbe sapere chiedere un punteggio aggiornato e scoprire se è busto o meno. Opinioni?

Nel mio ViewModel, ho la logica per catturare un’immagine reale di una carta da gioco (basata su seme, rango) e renderla disponibile per la vista. Il modello non dovrebbe preoccuparsi di questo (forse l’altro ViewModel userebbe solo i numeri invece di riprodurre le immagini delle carte). Certo, forse qualcuno dirà che il Modello non dovrebbe nemmeno avere il concetto di un gioco BlackJack e che dovrebbe essere gestito nel ViewModel?