9
votes

Comment recevoir la dialogue à l'aide de MVVM-Light Messenger

J'essaie d'utiliser la capacité MVVM-Light Messenger Capacité pour ouvrir une boîte de dialogue de mot de passe de confirmation personnalisée à ma vue, déclenchée par une commande dans mon viewModel.

Je pense que je comprends l'utilisation de messenger.default.register et messenger.default.send . .

mais comment puis-je obtenir les résultats de la boîte de dialogue dans ma viewModel?

Pour moi, l'envoi semble être une rue à sens unique ...

Quelqu'un pourrait-il aider un débutant avec un petit échantillon de code C # / WPF?

merci pour toute aide


0 commentaires

3 Réponses :


1
votes

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");


4 commentaires

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.



18
votes

IMHO Il est préférable d'utiliser la notification MessageAction code> telle qu'elle est découpée pour cette tâche.

sur le côté de l'expéditeur: p> xxx pré>

et sur le côté récepteur: p> xxx pré>

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 nOdificationMessageAction code>. IE P>

Messenger.Default.Register<ShowPasswordMessage>(this, (m) =>
{
    var dlg = new PasswordDialog();
    var result = dlg.ShowDialog();
    m.Execute(result);
});


6 commentaires

+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.



0
votes

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: xxx

Récepteur: xxx

Notez l'appel appel à la méthode de rappel de la dernière ligne de le récepteur. xxx


0 commentaires