J'ai implémenté mon message d'erreur MVVM en tant que boîte de dialogue Message qui s'abonne aux messages d'erreur via une classe de médiateur, de sorte que les autres mentionnements de vue puissent le notifier si des erreurs se produisent. P>
Lorsqu'une erreur se produit, j'ai défini l'attribut de visibilité dans la fenêtre ViewModel pour afficher la fenêtre d'erreur. Tout cela est lié dans la fenêtre d'erreur de la vue de la vue. P>
Cependant, cette fenêtre n'est pas modale! J'ai besoin de le montrer comme une boîte de dialogue et non seulement la visibilité à True - existe-t-il une sorte de contraignante que je puisse faire, même si je dois prolonger la fonctionnalité de la fenêtre? Je préférerais ne pas casser MVVM si je peux l'éviter. P>
Merci! P>
6 Réponses :
La scission de la vue / viewModel est censée diviser le regard de la fonctionnalité. Je crois fermement que la fenêtre est la fonctionnalité et regardez-la en une. Par exemple, si dans votre erreur ERMORMESSAGEVIEWMODEL, vous aviez ce code qui exécute lorsqu'il y a des erreurs: de sorte que le contenu de la boîte de dialogue est la vue de la liste de dialogue de votre liste d'erreur. Définissez votre vue sous forme de modèle de données qui s'applique automatiquement à la liste de la liste d'erreur. P> ne ressemble pas à mvvm? P> Le fait est que la classe de la fenêtre est une vue de vue pour la fenêtre que vous voyez à l'écran. En modifiant les propriétés de l'objet de la fenêtre, il affecte la "vue" comme si les propriétés de la fenêtre sont liées à une fenêtreViewModel. La seule chose qui manque est la possibilité de "resserrer" la fenêtre à l'aide de WPF, et peu importe la difficulté que vous essayez de la mettre en œuvre, vous ne pourrez pas le faire. L'utilisateur peut resserrer une fenêtre en modifiant leur thème de bureau, mais vous n'êtes pas en contrôle. Le mieux que vous puissiez faire est d'éteindre le chrome et / ou de le faire en plein écran. P> P>
@Russau: On supposerait que Microsoft a effectué des tests unitaires raisonnables sur la classe de la fenêtre elle-même. Vous pouvez certainement écrire des tests d'unité qui exercent toute fonctionnalité supplémentaire que vous écrivez dans la classe WindowviewModel lui-même.
Vous trouvez un exemple de la manière dont Windows (ne comptez pas si elles sont modales ou non) sont affichées, dans l'exemple de ce projet de vue: P>
Cadre d'application WPF (WAF) P>
Dans mon article de blog récent Vous trouverez une solution simple pour les boîtes de dialogue modales et les boîtes de messages dans MVVM pour Silverlight, mais cela peut être simplement réutilisé dans WPF: P>
J'ai posté un commentaire à votre article, il attend toujours la deuxième journée de modération. Je vais donc dupliquer ma réponse ici: "Vous affirmez que c'est une décision agnostique de la plate-forme, mais aussi loin que je sache, WPF Window a une méthode showdialog destiné à se montrer comme une boîte de dialogue modale. Bien que vous utilisiez la méthode d'exposition habituelle. Cela ne conduirait pas à un comportement modal, n'est-ce pas? "
Je travaille également sur un projet MVVM où j'ai besoin de boîtes à dialogues modales ou de messages de messagerie. J'ai trouvé la manière suivante de la résoudre: p>
Le logiciel utilise une seule fenêtre. L'élément racine de la mise en page est une grille sans rangée ou colonnesDéfinitions. La grille a trois enfants: P>
Le point de vue de la fenêtre principale a un membre appelé modal. S'il s'agit de NULL, les deux grilles à usage modal sont effondrées grâce à la diffusion de la base de données et à un convertisseur de visibilité. Collabossed. P>
Lorsque le programme souhaite afficher par exemple une boîte de message modal, une MessageBoxViewModel est instanciée et attribuée à MainviewModel.Modal. Le messageboxviewModel a une commande pour un bouton OK. Cette commande soulève un événement qui définit le MainviewModel.Modal à NULLL. P>
La grille de voile octroie le DockPanel principal, de sorte qu'aucune commande en dehors de la commande modale n'accepte l'entrée. P>
Votre programme peut soit exécuter un messagePump jusqu'à ce que vous appuyez sur OK, ou la commande OK peut déclencher la suivante. Il existe de nombreuses façons de résoudre différents besoins, mais la solution Model-Modelview devrait les soutenir. P>
Je pense que cela est aussi bon un modèle de la vue en mode modal que l'on peut espérer. p>
J'ai fait un therhavior pour attacher des dialogues modales à la commande.
http://www.clr-namespace.com/post/mvvmmodal-dialog-before-running-command.aspx p>
J'utilise la même méthode que Scott Whitlock.
Il n'y a qu'une seule propriété importante pour définir: p>
Peut-être remplacer un manuel surVistibilité dans le code-derrière-derrière de la fenêtre d'erreur?