Nous venons d'entrer dans MVVM dans WPF.MVVM ViewModel doit-il effectuer une conversion/validation de type?
Nous avons implémenté nos ViewModels avec des propriétés 'fortement typées' (int, double? Etc.) auxquelles nous nous lions dans la vue.
La conversion de type fonctionne normalement, et la saisie de données est assez simple. Mais nous rencontrons des problèmes de validation. Si, par exemple, une valeur non numérique est entrée dans une zone de texte liée à une propriété numérique, la conversion échoue, la propriété n'est jamais définie et nous n'avons jamais la possibilité de fournir une rétroaction adéquate à l'utilisateur. Pire encore, la propriété conserve sa valeur actuelle, ce qui entraîne une discordance entre ce qui est affiché dans la vue et ce qui est réellement dans le ViewModel.
Tout cela peut être manipulé avec des convertisseurs de valeur, je sais. Mais j'ai vu plusieurs opinions à l'effet que la conversion ne devrait pas être la responsabilité du point de vue du tout. Ce qui est entré dans la vue sont des chaînes, et la conversion, la validation, etc. devraient être la responsabilité de ViewModel (donc l'argument va). Si tel est le cas, nous devrions réécrire la plupart des propriétés de nos ViewModels en chaîne, et fournir des informations d'erreur via l'interface IErrorInfo, par exemple. Il ferait sûrement pour XAML plus simple, plus léger dans la vue. D'un autre côté, la conversion, la validation, etc. seront moins déclaratives, explicites et flexibles, du point de vue du View Designer. Il nous semble que ces deux approches sont fondamentalement différentes, alors avant de nous décider, nous aimerions avoir des avis éclairés sur le SO. Donc: est-ce que ViewModels devrait exposer une interface simplifiée, basée sur le texte, à la vue et gérer la conversion en interne? Ou est-ce que les propriétés de ViewModel devraient exposer les types de données réels, laissant ces tâches à la vue?
Mise à jour:
difficile de choisir un gagnant, mais j'ai finalement atterri sur un d'entre vous qui se termine plus ou moins comme moi. En particulier, nous avons décidé de conserver les propriétés de ViewModel en les tapant dans le champ. La raison principale de ceci est la flexibilité qu'il nous offre dans la conception de la vue, et la puissance de conversion/formatage explicite et déclarative en XAML.
J'ai noté une hypothèse avec vous qui ne sera pas d'accord avec nous à ce sujet, que la conception de la vue est fixe et prêt. Par conséquent, aucune décision concernant la conversion, le formatage, etc. ne doit être prise dans la vue. Mais le nôtre est un processus agile, et nous n'avons pas compris tous les détails de l'interface utilisateur. En fait, laisser les détails de l'interface utilisateur en cours d'élaboration laisse place à la créativité et, à mon avis, même un design méticuleusement élaboré finira toujours par se transformer tout au long du processus de mise en œuvre. Le but de tout cela est que, bien que l'application des règles métier appartienne certainement au ViewModel, il nous semble que la simple conversion et le formatage sont une vue-chose. Cela peut sembler hérétique, mais je ne pense pas que la conversion de type dans la vue nécessite des tests unitaires du tout (si longtemps nous testons les convertisseurs de type réels).
Dans l'ensemble, une excellente discussion, les gens, avec des opinions bien formulées et bien informées. Merci.
Était sur le point de poser cette question. +1 – Gishu