238 votes

La manipulation des boîtes de dialogue en WPF avec MVVM

Dans le modèle MVVM pour WPF, la manipulation des boîtes de dialogue est l'une des activités les plus complexes. Que votre modèle de vue ne savez rien à propos de la vue, le dialogue, la communication peut être intéressant. Je peux exposer un ICommand que lorsque la vue invoque, une boîte de dialogue peut apparaître.

Est-ce quelqu'un connais un bon moyen de gérer les résultats à partir des boîtes de dialogue? Je parle des boîtes de dialogue windows comme MessageBox.

L'un des moyens que nous avons fait, c'est un événement dans le viewmodel que la vue s'abonner à quand un dialogue est nécessaire.

public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;

C'est OK, mais cela signifie que le point de vue nécessite le code qui est quelque chose que je voudrais rester à l'écart de.

130voto

Jeffrey Knight Points 2654

Je suggère de renoncer à la des années 1990 des boîtes de dialogue modales et, au lieu de la mise en œuvre d'un contrôle comme une superposition (toile+positionnement absolu) avec une visibilité liée à une valeur booléenne de retour dans la VM. Plus proche d'un ajax type de contrôle.

C'est très utile:

<BooleanToVisibilityConverter x:Key="booltoVis" />

comme dans:

<my:ErrorControl Visibility="{Binding Path=ThereWasAnError, Mode=TwoWay, Converter={StaticResource booltoVis}, UpdateSourceTrigger=PropertyChanged}"/>

Voici comment j'ai celui mis en œuvre en tant que contrôle de l'utilisateur. En cliquant sur le " x " ferme le contrôle dans une ligne de code dans le usercontrol code derrière. (Depuis que j'ai mon point de Vue dans un .exe et Viewmodel dans une dll, je ne me sens pas mal à propos de code qui manipule l'INTERFACE utilisateur.)

Wpf dialog

53voto

Roubachof Points 1543

Vous devez recourir à un médiateur pour cela. Un médiateur est une commune modèle de conception aussi connu comme Messager dans certains de ses implémentations. C'est un paradigme de type Registre/Avertir, et permet à votre ViewModel et les points de Vue de communiquer au moyen d'une faible couplé à la messagerie mécanisme.

Vous devriez vérifier le google WPF groupe de Disciples, et il suffit de chercher pour le Médiateur. Vous serez bien heureux avec les réponses...

Vous pouvez cependant commencer avec ceci:

http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator-prototype-for-wpf-apps/

Profitez-en !

Edit: vous pouvez voir la réponse à ce problème avec le MVVM Light Toolkit ici:

http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338

35voto

user92541 Points 221

Une bonne MVVM boîte de dialogue:

  1. Être déclarée avec seulement XAML.
  2. Bénéficiez de tous c'est le comportement de la liaison de données.

Malheureusement, WPF ne fournit pas ces caractéristiques. Afficher une boite de dialogue nécessite un code-behind appel à ShowDialog(). La Fenêtre de la classe, qui prend en charge les boîtes de dialogue, ne peut pas être déclarée dans le code XAML de sorte qu'il ne peut pas facilement être lié aux données pour le DataContext.

Pour résoudre cela, j'ai écrit un code XAML stub de contrôle qui se trouve dans l'arborescence logique et des relais de liaison de données pour une Fenêtre et les poignées d'afficher et de masquer la boîte de dialogue. Vous pouvez le trouver ici: http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

Il est vraiment simple d'utilisation et ne nécessite aucune étrange changs pour votre ViewModel et ne nécessite pas des messages ou des événements. L'appel de base ressemble à ceci:

<dialog:Dialog Content="{Binding Path=DialogViewModel}" Showing="True" />

Vous voudrez probablement ajouter un style qui définit Montrant. Je l'explique dans mon article. J'espère que cela vous aide.

25voto

blindmeis Points 10881

J'utilise cette approche pour les dialogues avec MVVM.

Tout ce que j'ai à faire maintenant est de téléphoner à la suite de mon point de vue modèle.

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

16voto

Roboblob Points 1129

Ma solution actuelle résout la plupart des problèmes que vous avez mentionnés, mais son complètement abstraction de la plate-forme des choses spécifiques et peuvent être réutilisés. Aussi, j'ai pas utilisé de code-behind de la seule liaison avec DelegateCommands que de mettre en œuvre ICommand. Dialogue est fondamentalement un point de Vue - un contrôle qui a sa propre ViewModel, et il est indiqué de le ViewModel de l'écran principal, mais déclenchée à partir de l'INTERFACE utilisateur via DelagateCommand de liaison.

Voir plein de Silverlight 4 solution ici des boîtes de dialogue Modales avec MVVM et Silverlight 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X