2010-07-27 22 views
10

¡Saludos! Estoy disfrutando de la luz usando MVVM marco -gran - ha hecho mi vida mucho más fácil, y ha eliminado una serie de barreras que resultaban difíciles de superar ....usando MVVM light messenger con Silverlight 4 ChildWindow clase de diálogo

Pregunta:

Estoy tratando de configurar una costumbre cuadro de diálogo para editar mensajes que los usuarios se envían entre sí. Estoy intentando construir un cuadro de diálogo personalizado Silverlight utilizando el objeto ChildWindow utilizando el marco MVVM.

preguntaba si había alguna sugerencia en cuanto a cómo se puede lograr esto

Siguiendo el código de ejemplo MVVM de diálogo que encontré aquí: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 me quedé atrapado porque el objeto de diálogo ChildWindow en Silverlight es asíncrono, y tiene una diferente Clase de resultado

Entonces, la idea básica que tengo ahora es usar el modelo de vista de la clase (en este caso, Matrix.MessageViewModel) para crear una instancia del cuadro de diálogo personalizado, enviarlo a través del proceso Messenger.Send <>. el mensaje registrado en la vista para mostrar el cuadro de diálogo, luego hacer que el manejador de botón Guardar del cuadro de diálogo de ChildWindow active Messenger.Send con los contenidos modificados que se almacenan usando el método Save en el modelo de vista ...

Parece un poco round-about - así que quería asegurarme de que no había una manera más limpia ...

Pedazos de código relevantes:

vista del modelo:

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

de diálogo Guardar:

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

Esto se relaciona de nuevo en el modelo de vista, que tiene un Messenger.Default .Regístrese <> mirando por CommandTypes.MessageSave que enruta el MessageItem resultante al modelo para el almacenamiento .....

Respuesta

8

Eso es bastante parecido a lo que haría, excepto que hay un par de cosas que hago de manera diferente.

  1. Tendría un modelo de vista para mi vista de diálogo, y movía la lógica de mensajes a ella en lugar del código de la vista detrás.
  2. Usaría un comando Guardar en mi modelo de vista y uniría el ButtonSave a ese comando. Eso mueve la lógica de guardado al modelo de vista en lugar del código detrás de su vista.
  3. Está utilizando un mensaje diferente cuando se hace clic en el botón Guardar. Además, no está utilizando la devolución de llamada de DialogMessage. Asumiendo que cambie a usar un comando Guardar, podría guardar el mensaje en un miembro privado en el modelo de vista, luego usar la devolución de llamada del mensaje cuando el usuario lo guarde.
  4. Es posible que desee pensar en volver a utilizar la vista de diálogo o en asegurarse de que la vista se está limpiando correctamente para que no se pierda la memoria.

He aquí los cambios que haría a su modelo de vista siguientes sugerencias 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

excelente gracias! Obtuve el enfoque original funcionando, pero lo refactorizaré al tuyo. Creo que tus sugerencias resolverán algunas otras cosas con las que me he encontrado ... –

+0

@Mike Morley, deberías aceptar esto como la respuesta. –

Cuestiones relacionadas