J'essaie d'utiliser la capacité Je pense que je comprends l'utilisation de Pour moi, l'envoi semble être une rue à sens unique ... P>
Quelqu'un pourrait-il aider un débutant avec un petit échantillon de code C # / WPF? p>
merci pour toute aide p> messenger.default.register code> et
messenger.default.send code>. p>.
3 Réponses :
Dans la méthode de l'enregistrement Vous pouvez afficher une boîte de dialogue et transmettre la référence de ViewViewModel.
Messenger.Default.Send(viewModel, "showDialog");
Messenger.default.send () est une fonction asynchrone, revenant immédiatement, n'est-ce pas? Comment puis-je savoir quand la boîte de dialogue est fermée et que le résultat peut être interrogé?
Puis-je utiliser une fonction de rappel ou quelque chose comme ça? Je suis un peu confus.
Envoyer () La fonction déclenchera la Lambda où votre boîte de dialogue apparaît. Comme il s'agit d'une boîte de dialogue modale (méthode showdialog), il bloque le flux de travail jusqu'à sa fermeture de la fermeture.
Merci pour votre réponse Arseny.
IMHO Il est préférable d'utiliser la notification sur le côté de l'expéditeur: p> et sur le côté récepteur: p> Je crois que cette approche est Nettoyant, car il ne crée pas une dépendance inutile de la vue sur la vue de la vue (bien que ce type rond n'est pas si mauvais). Pour une meilleure lisibilité, envisagez la sous-classement du MessageAction
nOdificationMessageAction
Messenger.Default.Register<ShowPasswordMessage>(this, (m) =>
{
var dlg = new PasswordDialog();
var result = dlg.ShowDialog();
m.Execute(result);
});
+1: votre réponse m'a beaucoup aidé! Merci pour la bonne explication. Je ne connaissais pas aussi le problème de l'enregistrement. Malheureusement, je n'ai pas trouvé de bonne et complète de documentation pour MVVM-Light, seulement quelques blogs et exemple de code.
Fonctionne très bien. Une petite erreur: il devrait être 'var msg = nouveau showpasswordMessage (ceci, (r) =>' sur le côté de l'expéditeur. Peut-être que vous pouvez le modifier pour une référence future (je n'ai pas assez de privilèges)
@nabulke: Blog de Laurent chez Galasoft.ch a quelques bons exemples. De plus, sa vidéo Mix 2010 est un must pour commencer la lumière MVVM. Post édité.
@Axeleckenberger C'est une bonne réponse, mais il y a une prise, que si quelqu'un veut mettre la couche de menu de vie dans un assemblage séparé? Ainsi, l'utilisation d'une messagerie directement dans ViewModel a besoin d'une référence pour System.Windows et ce n'est pas le meilleur aussi loin que nous souhaitons perdre toute dépendance à la couche d'interface utilisateur.
Je veux dire que si nous acceptons ici d'utiliser MessageboxResult directement dans la couche de vie de la fenêtre, il est donc plus facile de le faire et pourtant rester ouvert pour tout changement futur à l'aide de DI et de CIO.
@amir Oveisi Ce n'était qu'une approche rapide. Toutefois, si vous souhaitez vraiment séparer l'interface utilisateur et la machine virtuelle complète dans votre code de production, j'écrirais une énumération personnalisée qui présente les mêmes valeurs entières que MessageboxResult, jetez le messageboxresult à cette enum personnalisée, puis transmettez cette énumération à la machine virtuelle.
Pour atteindre ce qui précède à l'aide de la boîte de dialogue, comme le suggère le titre, On peut utiliser ce qui suit:
côté de l'expéditeur: em> str> p> Récepteur: em> strud> p> Notez l'appel em> em> strud> appel à la méthode de rappel de la dernière ligne de le récepteur. p>