2010-07-27 20 views
10

Salutations! Jouis en utilisant MVVM lumière cadre -Grande - a rendu ma vie beaucoup plus facile, et a supprimé un certain nombre d'obstacles qui ont été difficiles à surmonter révèlent ....en utilisant MVVM light messenger avec Silverlight 4 Classe de dialogue ChildWindow

Question:

Je tente d'installer une coutume boîte de dialogue pour l'édition des messages que les utilisateurs envoient les uns aux autres. Je tente de construire une boîte de dialogue personnalisée Silverlight en utilisant l'objet ChildWindow à l'aide de l'infrastructure MVVM.

Je me demandais s'il y avait des suggestions quant à la façon dont cela pourrait être accompli

Après l'exemple de code MVVM dialogue J'ai trouvé ici: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 je suis coincé parce que l'objet de dialogue ChildWindow dans Silverlight est async, et a un autre Classe de résultat Donc, l'idée de base que j'ai maintenant est d'utiliser le modèle de vue de la classe (dans ce cas, le Matrix.MessageViewModel) pour créer une instance de la boîte de dialogue personnalisée, envoyez-la via Messenger.Send <>, processus le message enregistré dans la vue pour afficher la boîte de dialogue, puis le gestionnaire de bouton Enregistrer la boîte de dialogue ChildWindow déclencher un Messenger.Send avec le contenu modifié qui est ensuite stocké en utilisant la méthode Save sur le modèle viewmodel ...

Semble un peu rond-sur - donc voulu s'assurer qu'il n'y avait pas un moyen plus propre ....

bits de code pertinents:

vue modèle:

messageDialogBox = new MessageEditorDialog(
    selectedMessage, this.SelectedSiteId, this.LoggedOnEmployee.Id, this.Projects); 

DialogMessage editMessage = new DialogMessage(
    this, messageDialogBox,"Edit Message", DialogMessageCallback); 
Messenger.Default.Send(editMessage); 

Vue:

public ViewHost() 
{ 
    InitializeComponent(); 

    Loaded += new RoutedEventHandler(ViewHost_Loaded); 

    if (!ViewModelBase.IsInDesignModeStatic) 
    { 
     // Use MEF To load the View Model 
     CompositionInitializer.SatisfyImports(this); 
    } 

    ApplicationMessages.IsBusyMessage.Register(this, OnIsBusyChange); 

    Messenger.Default.Register<DialogMessage>(this, msg => ShowDialog(msg)); 
} 



private void ShowDialog(DialogMessage msg) 
{ 
    MessageEditorDialog myDialog = (MessageEditorDialog) msg.Target; 
    myDialog.Show(); 
} 

Dialog Economie:

private void ButtonSave_Click(object sender, RoutedEventArgs e) 
{ 
    Messenger.Default.Send<Message>(
     this.MessageItem, CommandMessages.MessageTypes.MessageSave); 
} 

Ce lien de nouveau dans le ViewModel, qui a un Messenger.Default .Enregistrer <> regarder pour le CommandTypes.MessageSave qui route le MessageItem résultant au modèle pour le stockage .....

Répondre

8

C'est assez sacrément proche de ce que je ferais, excepté qu'il y a deux ou trois choses que je fais différemment.

  1. Je disposerais d'un modèle de vue pour ma vue de boîte de dialogue et y déplacerais la logique de messagerie plutôt que le code de la vue.
  2. Je voudrais utiliser une commande Enregistrer dans mon modèle de vue et lier ButtonSave à cette commande. Cela déplace la logique de sauvegarde vers le modèle de vue au lieu du code derrière votre vue.
  3. Vous utilisez un message différent lorsque vous cliquez sur le bouton Enregistrer. En outre, vous n'utilisez pas le rappel de DialogMessage. En supposant que vous utilisiez une commande Enregistrer, vous pouvez enregistrer le message dans un membre privé dans le modèle de vue, puis utiliser le rappel du message lorsque l'utilisateur enregistre.
  4. Vous pouvez envisager de réutiliser la vue de boîte de dialogue ou de vous assurer que la vue est nettoyée correctement pour éviter une fuite de mémoire.

est ici les changements que je ferais à votre modèle de vue suite aux suggestions 2 & 3.

public class MessageEditorDialogViewModel : ViewModelBase 
{ 
    private DialogMessage _dialogMessage; 

    public RelayCommand SaveCommand { get; private set; } 

    public DialogMessage Message { get; set; } 

    public MessageEditorDialogViewModel() 
    { 
     SaveCommand = new RelayCommand(SaveCommandExecute); 
    } 

    private SaveCommandExecute() 
    { 
     Message.Execute(); 
    } 
} 
+0

excellent merci! J'ai eu l'approche originale de travail, mais refactor à la vôtre - je pense que vos suggestions vont résoudre quelques autres choses que j'ai rencontrées ... –

+0

@Mike Morley, vous devriez accepter cela comme la réponse. –