Dans l'exemple client que vous donnez, le CustomerModel contient toutes les informations stockées par votre base de données (ou autre backend). Le CustomerViewModel contient des informations similaires si elles sont affichées sur l'interface utilisateur (Nom etc., potentiellement 50 autres propriétés si vous avez une classe importante) mais utilise l'interface INotifyPropertyChanged pour les afficher en tant que propriétés que la vue (ie le XAML) peut lier à.
par exemple.
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
Le ViewModel contient également d'autres bits d'état interface utilisateur - drapeaux de visibilité, index Tab actuelle, les bits plus complexes de texte construit à partir des données dans plusieurs domaines, ObservableCollection < > des éléments enfants, etc. Tous sont là pour être lié au XAML.
J'ai vu le ViewModel créé à partir du modèle comme un processus ponctuel, unidirectionnel, par exemple. avec un constructeur:
CustomerViewModel viewModel = new CustomerViewModel(customer);
ou comme méthode d'extension
CustomerViewModel viewModel = customer.ToViewModel();
Je n'ai vu aucune disposition pour mettre à jour un ViewModel des modifications du modèle - le point de la ViewModel est qu'il est isolé de le modèle. Il conserve une copie séparée des données. Il ne propage pas les modifications vers le modèle, pas avant d'avoir appuyé sur un bouton "Enregistrer". Donc, si vous annulez à la place, rien dans le modèle n'a changé et il n'y a rien à annuler.
Vous essayez peut-être trop de garder le ViewModel à jour avec le modèle - la plupart des cas comme enregistrer ou charger vous pouvez simplement jeter le ViewModel actuel et en créer un nouveau à partir de l'état actuel du modèle. Avez-vous besoin de conserver l'état de l'interface utilisateur de ViewModel et de modifier les données? Ce n'est pas une exigence courante, mais cela peut être fait avec une méthode ou deux appelée quand la sauvegarde ou la charge se produit.
Donc, il y a aussi l'hypothèse que cette logique de branchement arrive quelque part. C'est pourquoi la plupart des modèles qui impliquent vues impliquent également contrôleurs qui sont chargés d'agir sur les commandes (par exemple, afficher un client, enregistrer un client) et mettre en place un nouvel état de l'interface utilisateur par la suite.
Si vous conservez ViewModel distinct du modèle, comment les règles du modèle sont-elles appliquées? Dire que j'ai un modèle avec quantité et valeur. Si je change la Qté sur le ViewModel qui devrait passer au modèle qui met à jour la valeur basée sur la nouvelle Qté. Maintenant, ViewModel devrait montrer la nouvelle valeur. –
"Si je change la quantité sur le ViewModel qui doit passer au modèle" non, pas avant d'avoir appuyé sur un bouton Enregistrer ou similaire. Lorsque vous le faites, le gestionnaire doit mettre à jour le modèle, le conserver et créer un nouveau ViewModel à partir du nouvel état du modèle. – Anthony
Donc, si elle ne passe pas au modèle, alors comment ViewModel obtient-elle un champ de valeur mis à jour? Si je change la quantité, en tant qu'utilisateur je m'attendrais à voir la nouvelle valeur. Le MV n'a pas la logique métier pour calculer la valeur, seul le modèle le fait. –