Je me déplace sur une petite preuve d'application de concept. Ceci est principalement de renforcer mes compétences MVVM dans Silverlight. Je suis tombé sur un problème intéressant aujourd'hui que je ne pouvais pas comprendre comment résoudre le chemin MVVM. Je n'ai rien réussi à trouver quoi que ce soit pertinent pendant la recherche non plus. P>
Ainsi, sur le problème, j'ai une application de type d'entreprise simple avec une base de données arrière. J'ai une vue de connexion et un modèle de vue attaché qui effectuera la connexion et signaler le succès ou l'échec. Aucun problème. Ce que je n'ai pas été heureux avec juste pourtant, c'est un moyen de signaler un écran d'attente à l'utilisateur. Donc, étant donné mon écran de connexion, l'utilisateur cliquez sur Connexion et il y a un délai de quelques secondes pendant que la discussion de la base de données est terminée. J'aimerais signaler cela et désactiver toute interaction jusqu'à ce que l'appel soit terminé. P>
J'ai eu quelques idées. Tout d'abord, liez la propriété du curseur au point de vue de la vue et la machine virtuelle peut définir une propriété isbusy à true. Un problème avec c'est que je ne peux pas sembler ne pas se lier au curseur de l'UserControl (Visual Studio dit La deuxième idée est d'avoir un écran d'attente. Vous savez, les petites engrenages tournant ou quelle que soit l'animation que vous voulez. Et c'est bien, mais ce n'est pas vraiment clair pour moi comment je pourrais faire la vue à basculer cela à travers le modèle via XAML. Je sais que je pouvais certainement connecter des événements et gérer cela dans le code. Peut-être que c'est la voie à suivre? Semble un peu contre le grain MVVM. P>
serait intéressé par plus d'idées sur la façon de gérer cela. p>
merci. p> ag_e_runtime_managed_unknown_error code>). P>
3 Réponses :
Vous pouvez utiliser le prototype de médiateur que Josh Smith créé pour avoir un système de messagerie à couplage de manière lâche à partir du VM au V. Le VM pourrait pousser un message «occupé», avec la vue abonnée à cette "isbusy". message.
La vue pourrait alors afficher la boîte de dialogue correcte jusqu'à ce qu'un message "isnotbusy" soit reçu. p>
Une autre option consiste à passer à la vue de la vue dans le constructeur une interface comme IdialogProvider qui contient des méthodes pour montrer un dialogue. La mise en œuvre de ce fournisseur sera spécifique mais au moins le modèle de vue ne connaît que l'interface et non une implémentation concrète. P>
Merci beaucoup pour la réponse. J'ai lu l'article de Mediator plusieurs fois et je pense que je l'obtiens. Mais cela semble être trop exclu. J'aime l'IdialogProvider, mais je me batte avec moi-même environ un point, est-ce vraiment la responsabilité de la viewModel d'afficher l'interface utilisateur? Sinon, pourquoi ne pas simplement avoir des événements pour la vue pour s'abonner et le faire afficher UI en conséquence?
Si vous utilisez la vue pour lier à des événements sur la machine virtuelle, pourquoi la machine virtuelle est-elle en premier lieu. Le fournisseur Idialog pourrait être une interface pour laisser la vue savoir qu'une boîte de dialogue est requise. La DoucheRormessage pourrait être remplacée par tout ce que vous voyez en forme.
Nous avons fini par utiliser un service pour traiter les demandes de fonctionnement de longues demandes. Le service prend la charge de travail en tant que délégué, puis le transmet à un travailleur d'arrière-plan, tout en ouvrant notre point de vue «Veuillez patienter».
Cela fonctionne bien car il nous permet de contrôler de longs processus de course dans toutes nos mentales de vie façon, avec une interface assez simple. p>
Vous pouvez avoir des événements provenant de la mise à jour de la vue ViewModel, la vue lorsque vous avez besoin d'un retard, mais vous devez ensuite avoir ce code dans toutes vos images de vue et non dans un seul classe qui peut être maintenue plus facilement. p>
{
var processingService = container.Resolve<IProcessingService>();
processingService.Process(worker =>
{
worker.ReportProgress(0, "Please wait...");
// Do work here
worker.ReportProgress(50);
// Do more work
worker.ReportProgress(100);
});
}
Cela vous dérangeriez-vous d'élaborer un peu un peu? Lorsque vous dites «fini par utiliser un service», je ne suis pas tout à fait suivi. De toute évidence, j'utilise un service de WCF pour gérer le processus, SL appelle le service asynchornement, dis-tu qu'il existe un autre service qui appelle le service WCF? J'aime beaucoup l'idée d'avoir l'écran / code d'attente 'dans une seule place, c'est finalement ce que je suis après.
Je pense que les autres pourraient être "omnimant" celui-ci ...
Je recommanderais d'utiliser l'anseindicator dans la boîte à outils Silverlight. p>
simple xaml: p>