Boîte de dialogue ouvrir dans WPF MVVM
J'ai une application qui a besoin d'ouvrir une boîte de dialogue à partir d'un bouton où l'utilisateur entre des informations.
Pour le moment je fais comme ça (qui fonctionne correctement)
- Cliquez sur le bouton génère une commande dans le ViewModel.
- Le ViewModel déclenche un événement auquel le Contrôleur écoute.
- Le Contrôleur, les détails de la nouvelle fenêtre (c'est à dire de la Vue, ViewModel & modèle) et l'ouvre (ShowDialog)
- Lorsque la fenêtre est fermée le Contrôleur ajoute le résultat à la eventargs et retourne dans le ViewModel
- Le ViewModel transmet les informations sur le Modèle.
Il y a beaucoup d'étapes, mais ils ont tous un sens et il n'y a pas beaucoup de frappe.
Le code ressemble à ceci (la fenêtre vous demande le nom de l'utilisateur)
ViewModel:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
Contrôleur:
mViewModel.AskUserName += (sender,e) => {
var view = container.Resolve<IAskUserNameView>();
var model = container.Resolve<IAskUserNameModel>();
var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
if (dlg.ShowDialog() ?? false)
e.UserName = model.UserName;
}
Ma question est de savoir comment la communication horizontale travaille dans le pattern MVVM.
En quelque sorte, il semble erroné de laisser le contrôleur être impliqués dans le transfert de données entre les modèles.
J'ai regardé le médiateur modèle de laisser les modèles de communiquer directement. N'aime pas cette idée, car il rend le modèle en fonction de implemetations détails de l'interface graphique. (c'est à dire si la boîte de dialogue est remplacé par une zone de texte, le modèle doit changer)
Oui j'ai regardé, mais ils ont tous recommandent un modèle de diffusion de résoudre quelque chose qui est en instance en instance.
'Le clic de bouton génère une commande dans le ViewModel.', qu'est-ce que cela signifie? "Le ViewModel déclenche un événement auquel le Contrôleur écoute", ce contrôleur?!
OriginalL'auteur adrianm | 2009-11-26
Vous devez vous connecter pour publier un commentaire.
Je n'aime pas la plupart des suggestions pour une raison ou une autre, donc j'ai pensé à un lien presque identique à la question avec des réponses, je ne comme:
Dialogue d'ouverture de Fichier MVVM
Spécifiquement la réponse par Cameron MacFarland est exactement ce que je fais. Un service fourni par l'intermédiaire de une interface de fournir des IO et/ou de l'interaction de l'utilisateur est le chemin à parcourir ici, pour les raisons suivantes:
Espère que cette aide.
Si vous utilisez du Cio, je voudrais juste déclarer quelque chose comme votre IDialogService comme une dépendance. En général, je pense que le Cio comme un catalogue de services à la disposition de tous les objets constitutifs.
OriginalL'auteur Anderson Imes
- je utiliser cette approche pour les dialogues avec mvvm.
tout ce que j'ai à faire maintenant est de téléphoner à la suite de mon viewmodel de travailler avec une boîte de dialogue.
OriginalL'auteur blindmeis
J'ai rencontré des problèmes similaires. Voici comment j'ai résolu, et pourquoi j'ai fait ce que j'ai fait.
Ma solution:
Mon MainWindowViewModel a une propriété de type ModalViewModelBase Modales.
Si mon code a besoin d'un certain point de vue à être modale, il met une référence dans cette propriété. Le MainWindowView montres de cette propriété par le biais de la INotifyPropertyChanged mécanisme. Si Modal est une machine virtuelle, le MainWindowView classe prendra le VM et le mettre dans un ModalView fenêtre où le contrôle utilisateur sera montré par la magie de l'DataTemplates, l'ouverture de la fenêtre à l'aide de ShowDialog. ModalViewModelBase a une propriété DialogResult et une propriété appelée IsFinished. Lorsque IsFinished est défini sur true par le modal VM, la vue se ferme.
J'ai aussi quelques trucs spéciaux pour faire interactif des choses comme cela à partir de backgroundworker threads qui veulent demander à l'utilisateur d'entrée.
Mon raisonnement:
Le principe des points de vue modal, c'est que d'autres points de vue sont désactivés, alors que le modal est montré. C'est une partie de la logique de la Vue qui est essentiellement lookless. C'est pourquoi j'ai une propriété dans le MainWindowViewModel. Il je devais aller encore plus loin, je dois faire tous les autres biens ou de commande pour tous les autres VM dans les Principales VM lancer des exceptions, tandis que sur le mode de mode, mais j'ai l'impression que cela est excessif.
Le point de Vue du mécanisme de la négation à l'utilisateur de toute autre action, n'a pas à être effectuée avec une fenêtre pop-up et showdialog, il se pourrait que vous mettez le modal de la vue dans la fenêtre existante, mais de les désactiver tous les autres, ou quelque chose d'autre. Ce point de vue-la logique appartient à la vue elle-même. (Qu'un designer ne peut pas le code pour cette logique, semble une préoccupation secondaire. Nous avons tous besoin d'aide à certains moments.)
Donc, c'est comment je l'ai fait. Je vous le propose seulement comme une suggestion, il y a probablement d'autres façons de penser, et j'espère que tu auras plus de réponses en trop.
Le MainViewModel a encore une référence à la DialogViewModel après l'affichage du dialogue est fermée.
ok, c'est plus ou moins la même chose que je fais, mais vous le faites dans le viewmodel.
OriginalL'auteur Guge
J'ai utilisé EventAggregator de Prism v2 dans des scénarios similaires. La bonne chose à propos de prims, c'est que, vous n'avez pas à utiliser la totalité de la structure de votre application MVVM. Vous pouvez extraire EventAggregator de la fonctionnalité et de l'utiliser avec votre configuration actuelle.
vous êtes correct. Si votre souhait est pour votre message soit remis à une instance spécifique de l'Agrégateur d'Événements n'est pas approprié.
OriginalL'auteur Raj
Vous pourriez avoir un coup d'oeil à ce MVVM article. Il décrit comment un contrôleur peut communiquer avec le ViewModel:
http://waf.codeplex.com/wikipage?title=Model-View-ViewModel%20Pattern&ProjectName=waf
OriginalL'auteur xdoo