Commandant en MVVM (WPF)--comment retourner une valeur?
J'ai été en utilisant le pattern MVVM pour un certain temps maintenant, mais je continue à rencontrer des problèmes dans des situations de la vie réelle. En voici une autre:
J'utilise la commande et de la bulle de l'événement pour être traitées dans le ViewModel. Pour l'instant, donc bon. Mais le projet pour lequel je suis en utilisant MVVM est en fait une bibliothèque de classe. Une fois que je lance le code de commande, j'ai besoin d'être en mesure d'envoyer un objet à l'application appelante. Quelles sont suggéré des moyens pour le faire?
Spécifiquement:
Dans mon application appelante j'ai une page XAML liée directement à la bibliothèque du ViewModel, qui contient un objet "Thing1". Quand un bouton est cliqué, une méthode dans le ViewModel est appelé (appelons-la "CopyThing1()"). Il copie "Thing1 de" créer "Thing2". Puis-je envoyer "Thing2" retour à l'application appelante.
Merci!!!
OriginalL'auteur ml_black | 2010-02-10
Vous devez vous connecter pour publier un commentaire.
Des commandes n'ont pas de valeur de retour, ils modifient l'état de votre demande. En cas de ICommands attaché à Viewmodel c'est assez simple, parce que vous pouvez le faire simplement en la mutation de ce Dernier lorsque la commande est exécutée.
À l'aide de la RelayCommand de Josh Smith est excellent MVVM article:
Après l'appel de
myVM.MutateCommand.Execute(new object());
vous pouvez accéder à la nouvelle valeur demyVM.Thing
.Ne pas utiliser le code-behind; utilisation Viewmodel et de laisser les points de Vue ne reflètent que le Viewmodel changement. La Communication va dans un seul sens. C'est beaucoup plus propre approche.
Je suis d'accord. Mais l'application appelante n'utilise pas le Viewmodel. Et ce Dernier est destiné à plus d'une application appelante. Donc, dans ce cas, les informations de Thing2 doit être utilisée par chaque application appelante à sa manière. La bibliothèque est purement MVVM.
OriginalL'auteur Mark Seemann
Si Thing2 est une autre propriété sur votre viewmodel, vous pouvez utiliser la normale INotifyPropertyChanged pour informer l'INTERFACE utilisateur de le modifier.
Vous pouvez également utiliser Prism's
EventAggregator
pour une approche découpléeEn fait, connaissez-vous un bon exemple de EventAggregator utiliser? Aussi, quel est l'avantage du Prisme de la version sur la dehors-de-le-boîte?
OK, je comprends maintenant. Ne savais pas où Prisme est venu. Est le Démarrage rapide l'exemple le plus simple, vous connaissez?
Oui, le démarrage rapide est à peu près aussi simple que cela pour Prism. Si Prism a été critiqué par certains pour être trop encombrants. Plusieurs autres frameworks MVVM (voir stackoverflow.com/questions/1280462) ont des implémentations de ce modèle.
OriginalL'auteur kenwarner
L'idéal est de définir une nouvelle classe héritée de ICommand comme suit:
Noter que Execute2 renvoie la valeur comme une fonction normale.
Voici comment l'utiliser.
Appels Execute2 au lieu d'Exécuter retourne la valeur.
OriginalL'auteur Wayne Lo
Bien que l'info sur le commandement était clair et correct, il ne pouvait pas être appliquée dans mon cas, parce que la reponse nécessaire pour arriver était dans une application appelante N'utilisant MVVM et il n'a pas à être réponse de l'INTERFACE utilisateur. J'ai fait étudier Prisme, mais le trouve trop complexe pour ce que j'ai besoin en ce moment. J'ai fini de sensibilisation et de gestion des événements, comme décrit ici-->
WPF MVVM Façon Correcte de le Feu sur la Vue Du ViewModel
OriginalL'auteur ml_black