Je suis en train de parcourir quelques articles MVVM, principalement ceci et cela .
Ma question spécifique est la suivante: comment communiquer les modifications du modèle du modèle au ViewModel?
Dans l'article de Josh, je ne vois pas qu'il fasse ça. Le ViewModel demande toujours au modèle des propriétés. Dans l'exemple de Rachel, elle a mis en œuvre le modèle INotifyPropertyChanged
et déclenche des événements à partir du modèle, mais ils sont destinés à être consommés par la vue elle-même (voir son article / code pour plus de détails sur la raison pour laquelle elle fait cela).
Nulle part je ne vois des exemples où le modèle alerte le ViewModel des modifications apportées aux propriétés du modèle. Cela me fait craindre que ce ne soit peut-être pas fait pour une raison quelconque. Existe-t-il un modèle pour alerter le ViewModel des changements dans le modèle? Cela semble nécessaire car (1) il y a probablement plus d'un ViewModel pour chaque modèle, et (2) même s'il n'y a qu'un seul ViewModel, une action sur le modèle peut entraîner la modification d'autres propriétés.
Je soupçonne qu'il pourrait y avoir des réponses / commentaires du type "Pourquoi voudriez-vous faire cela?" commentaires, voici donc une description de mon programme. Je suis nouveau sur MVVM alors peut-être que toute ma conception est défectueuse. Je vais le décrire brièvement.
Je programme quelque chose de plus intéressant (du moins pour moi!) Que les classes "Client" ou "Produit". Je programme BlackJack.
J'ai une vue qui n'a aucun code derrière et qui repose simplement sur la liaison aux propriétés et aux commandes dans le ViewModel (voir l'article de Josh Smith).
Pour le meilleur ou pour le pire, j'ai adopté l'attitude que le modèle devrait contenir non seulement des classes telles que PlayingCard
, Deck
mais aussi la BlackJackGame
classe qui maintient l'état de l'ensemble du jeu, et sait quand le joueur a fait faillite, le croupier doit piocher des cartes, et quel est le score actuel du joueur et du croupier (moins de 21, 21, buste, etc.).
De BlackJackGame
j'expose des méthodes comme "DrawCard" et il m'est venu à l'esprit que lorsqu'une carte est dessinée, des propriétés telles que CardScore
, et IsBust
doivent être mises à jour et ces nouvelles valeurs communiquées au ViewModel. C'est peut-être une pensée erronée?
On pourrait prendre l'attitude que le ViewModel a appelé la DrawCard()
méthode afin qu'il sache demander un score mis à jour et savoir s'il est en panne ou non. Des avis?
Dans mon ViewModel, j'ai la logique de saisir une image réelle d'une carte à jouer (en fonction de la couleur, du rang) et de la rendre disponible pour la vue. Le modèle ne devrait pas être concerné par cela (peut-être qu'un autre ViewModel utiliserait simplement des nombres au lieu d'images de cartes à jouer). Bien sûr, certains me diront peut-être que le modèle ne devrait même pas avoir le concept d'un jeu BlackJack et que cela devrait être géré dans le ViewModel?
OnBust
et la machine virtuelle peut s'y abonner. Je suppose que vous pouvez également utiliser une approche de l'AIE.