Comment la validation et la sauvegarde des données dans WPF MVVM fonctionnent-elles correctement?

Je suis nouveau sur MVVM (et un peu de WPF) et j’ai lu de nombreux articles de Code Project, des articles de blogues et des questions sur Stackoverflow au cours des derniers jours. J’ai l’impression que la liaison de données fonctionne vraiment bien pour afficher les données une fois chargées à partir d’une source de données (firebase database) et pour maintenir le modèle synchronisé avec la vue, en mettant également à jour toutes les autres apparences des données de modèle dans la ou les vues.

Mais je n’ai toujours pas la moindre idée de la façon dont économiser, et avant de valider, est censé fonctionner correctement. J’ai de solides antécédents Windows Forms et ADO.NET. Je connais bien le codage de la couche d’access à la firebase database et de la mise à jour de la vue. À l’époque, vous disposiez de données temporaires, de données de travail, en cours de modification, uniquement dans la vue, ainsi que de la dernière version enregistrée des données dans les classes de modèle et la firebase database. Les classes de modèle étaient généralement synchronisées avec la firebase database. C’était la vue qui contenait les données qui n’avaient pas encore été sauvegardées.

Vous disposiez également d’un bouton Enregistrer qui lirait toutes les données des contrôles, les validerait dans le code, puis accepterait et les enregistrerait dans le modèle et la firebase database, ou ne mettrait pas à jour le modèle et afficherait un message d’erreur. En cas d’erreur, l’entrée de l’utilisateur est restée dans l’interface utilisateur pour que l’utilisateur puisse la corriger. Mais aucune autre partie de l’application ne pouvait le voir. Et vous disposiez d’un bouton Annuler qui supprime simplement la partie de la vue contenant les commandes de modification: le modèle est toujours valide et inchangé.

Maintenant que la liaison de données et les modèles de vue ne font qu’exposer les données des classes Model, ce qui est entré dans une zone de texte est immédiatement intégré au modèle, que ce soit correct ou non. IDataErrorInfo n’est rien d’autre que cela – informatif. Vous pouvez le considérer ou l’ignorer. La seule validation ferme appliquée est la conversion de type: vous ne pouvez jamais mettre à jour une chaîne non numérique dans un champ de modèle numérique. Mais c’est à peu près tout. Je vais résoudre ce problème en laissant le ViewModel effectuer toutes les validations et émettre une exception à partir du configurateur de propriétés sur les données non valides. C’est le seul moyen d’implémenter le comportement connu.

Mais où vont la sauvegarde et la suppression des données? Quand vais-je réellement écrire les données dans la firebase database? Chaque sortie d’une zone de texte provoque-t-elle une écriture dans la firebase database, de sorte que je n’ai plus besoin d’une commande explicite de sauvegarde (et que je ne revienne que par Revenir)? Quand vais-je valider tout un enregistrement de données? Comment vais-je gérer le modèle et la firebase database désynchronisés, une entrée non valide se propageant immédiatement dans l’ensemble de l’application et dans toutes les vues grâce à la liaison de données? Quand et comment puis-je supprimer toute entrée utilisateur avec un bouton Annuler, en laissant le modèle inchangé – ou en le rétablissant à un état antérieur à l’ouverture de la boîte de dialog de l’éditeur?

J’ai l’impression que MVVM ne fournit pas de solutions à ces problèmes élémentaires. Est-ce qu’ils me manquent ou est-ce qu’ils n’existent pas? Si MVVM n’est pas une solution à cela, alors qu’est-ce que c’est? Ou le MVVM ne devrait-il pas être mieux utilisé pour les applications d’édition de données dans WPF?

MVVM ne répond pas à ces problèmes pour vous – vous avez la flexibilité (puissance? Charge?) De résoudre l’écriture de firebase database de la manière que vous choisissez. Si vous devez collecter toutes les données avant de les enregistrer dans la firebase database, vous pouvez le faire. Il vous suffit d’append un bouton Enregistrer lié à une commande SaveCommand sur le ViewModel, qui exécute votre méthode de mise à jour de la procédure stockée / structure d’entité / autre, etc. Si vous souhaitez enregistrer chaque bit de données individuellement, vous devez appeler les procédures d’access aux données ailleurs (probablement les régleurs de propriétés du modèle de vue?)

En réalité, MVVM n’est pas un modèle logiciel complet de bout en bout. Il se contente de regarder la communication entre ce que l’utilisateur voit (zones de liste, zones de texte et boutons) et l’application elle-même. Votre code d’access aux données, la sérialisation, le stockage, la persistance, tout ce que vous utilisez et ce que vous utilisez, tout est conservé derrière le côté MVVM de l’application, dans votre code d’application (le modèle). Vous pouvez écrire cela comme bon vous semble.

J’écris actuellement une application dans laquelle un utilisateur remplit un formulaire et clique sur Enregistrer ou Annuler. Enregistrer et Annuler sont les deux boutons liés aux commandes du ViewModel. Dans le constructeur ViewModel, les propriétés d’un object de modèle sont copiées dans les propriétés du ViewModel. Lors de l’enregistrement, les propriétés du ViewModel sont recopiées dans les propriétés du modèle et le code d’access aux données est lancé. Sur Annuler, les propriétés du modèle sont recopiées sur les propriétés du ViewModel.

class MyViewModel { public MyViewModel(MyModel model) { this.Name = model.Name; this.Colour = model.Colour; } public ssortingng Name {get;set;} public ssortingng Colour {get;set;} // commands here that connect to the following methods public void Save() { model.Name = this.Name; model.Colour = this.Colour; model.SaveToDatabase(); } public void Cancel() { this.Name = model.Name; this.Colour = model.Colour; } } 

C’est une façon simple de le faire – bien sûr, vous devez INotifyPropertyChanged et le rest, et il existe d’autres options. Mais je trouve cette méthode facile à comprendre ce qui se passe et une bonne base pour append tout ce que vous pourriez avoir besoin de chuck po

Avec MVVM, vous liez les contrôles de votre vue aux propriétés et aux commandes de votre ViewModel. Le modèle représente votre firebase database.

La validation de la saisie de l’utilisateur peut être effectuée de plusieurs manières. Vous pouvez limiter les zones de texte à n’accepter que certaines données. Vous pouvez également valider les données dans les gestionnaires de propriétés, etc., etc.

Je ne suis pas un expert en firebase database, mais je voudrais collecter les informations dans ma machine virtuelle et append un bouton de sauvegarde quelque part dans la vue qui valide les données et les écrit dans la firebase database. Un bouton d’annulation pourrait écraser les propriétés de la machine virtuelle avec les valeurs (inchangées) du modèle (firebase database).

(edit: ce que dit Pete 🙂

Je pense que vous confondez ViewModel avec la firebase database, votre vue est liée à un object dans ViewModel, lorsque vous quittez une zone de texte, quoi que dans la zone de texte soit affecté à l’object de ViewModel, qui est toujours en mémoire. Vous aurez besoin d’un bouton de sauvegarde. MVVM est simplement un modèle permettant de séparer la vue traditionnelle et le code suivant pour le découplage et le test unitaire aisé. Vous devez toujours effectuer la validation des données après avoir cliqué sur le bouton Enregistrer. Pour ignorer les entrées utilisateur et revenir à l’état précédent, vous pouvez soit sauvegarder vos données ViewModel avant la modification, soit utiliser Entity Framework pour suivre et gérer les modifications de données.