2010-07-27 15 views
10

Saluti! Sto godendo utilizzando la luce MVVM quadro -Grande - ha reso la mia vita molto più facile, e ha rimosso una serie di ostacoli che sono stati rivelando difficile da superare ....utilizzando MVVM light messenger con Silverlight 4 ChildWindow classe di dialogo

Domanda:

Sto tentando di installare un personalizzato finestra di dialogo per la modifica dei messaggi che gli utenti si inviano reciprocamente. Sto tentando di costruire una finestra di dialogo personalizzata Silverlight utilizzando l'oggetto ChildWindow utilizzando il framework MVVM.

chiedevo se ci fossero eventuali suggerimenti su come questo potrebbe essere realizzato

seguito il codice di esempio MVVM finestra ho trovato qui: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 sono rimasto bloccato perché la finestra oggetto childWindow in Silverlight è asincrona, e ha un diverso Classe di risultato.

Quindi, l'idea di base che ho ora utilizza il modello di visualizzazione della classe (in questo caso Matrix.MessageViewModel) per creare un'istanza della finestra di dialogo personalizzata, inviarla tramite Messenger.Send <>, processo il messaggio registrato nella vista per visualizzare la finestra di dialogo, quindi il gestore del pulsante Salva della finestra di dialogo ChildWindow attiva un Messenger.Invia il contenuto modificato che viene quindi archiviato utilizzando il metodo Save sul viewmodel ...

Sembra un po ' round-about - quindi volevo essere sicuro che non ci fosse un modo più pulito ....

Bit di codice rilevanti:

vista del modello:

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

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

Vista:

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(); 
} 

finestra di dialogo Salva:

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

Questo legame indietro nel ViewModel, che ha un Messenger.Default .Registro <> guardando per il CommandTypes.MessageSave che indirizza il MessageItem risultante al modello per l'archiviazione .....

risposta

8

Questo è dannatamente vicino a quello che farei, tranne che ci sono un paio di cose che faccio in modo diverso.

  1. Avrei un modello di visualizzazione per la mia finestra di dialogo e sposterò la logica di messaggistica su di esso piuttosto che sul codice della vista.
  2. Vorrei usare un comando Salva nel mio modello di vista e associare il pulsante Salva a quel comando. Ciò sposta la logica di salvataggio nel modello di visualizzazione anziché nel codice retrostante della vista.
  3. Si sta utilizzando un messaggio diverso quando si fa clic sul pulsante Salva. Inoltre, non stai utilizzando la richiamata del DialogMessage. Supponendo che si passi all'utilizzo di un comando Salva, è possibile salvare il messaggio in un membro privato nel modello di visualizzazione, quindi utilizzare la richiamata del messaggio quando l'utente salva.
  4. Si consiglia di pensare a riutilizzare la visualizzazione della finestra di dialogo, o assicurarsi che la vista sia stata ripulita correttamente in modo da non finire con una perdita di memoria.

Ecco i cambiamenti che vorrei fare per il tuo modello di vista seguendo i suggerimenti 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

eccellente, grazie! Ho trovato l'approccio originale funzionante, ma lo rifatterò. Penso che i tuoi suggerimenti risolveranno alcune altre cose che ho incontrato ... –

+0

@Mike Morley, dovresti accettare questa come risposta. –

Problemi correlati