2009-08-26 15 views
9

Tengo una aplicación WPF que he estado tratando de escribir en el estilo MVVM. Si se lanza una excepción (como cuando se abre un documento), me gustaría mostrar un cuadro de mensaje. Es fácil de hacer, pero mi código no se siente del todo bien porque la llamada a MessageBox.Show está en ModelView. Pensé que ese tipo de cosas se supone que viven en la Vista, pero se supone que no debo poner código en la Vista.MVVM Exception Handling

Entonces la pregunta realmente se puede resumir en ¿cuál es la forma sugerida de mostrar un MessageBox en MVVM?

Respuesta

16

uso de un servicio:

public void SomeMethodInYourViewModel() 
{ 
    try 
    { 
     DoSomethingDangerous(); 
    } 
    catch (Exception ex) 
    { 
     ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message); 
    } 
} 

Ahora ha desacoplado sus máquinas virtuales desde la presentación de los mensajes. Incluso puede decidir no usar los cuadros de mensaje estándar (feo) en absoluto y eso no afectará a sus máquinas virtuales.

+1

+1: Además, una alternativa al uso de un ServiceLocator sería usar Inyección de dependencias para inyectar el servicio IMessageService en las máquinas virtuales según sea necesario. –

+0

Debido al desacoplamiento de la capa de presentación, puede probar su ViewModel por unidades. – jbe

9

Eche un vistazo a la excelente Fundación MVVM de Josh Smith en Codeplex. Específicamente, eche un vistazo a la clase Messenger, una forma ligera de pasar mensajes entre varios objetos de ViewModel que no necesitan conocerse entre sí.

Además, no creo que haya una regla rígida sobre "Sin código en la Vista", aunque es mejor evitarla si es posible ... recuerde que su XAML es simplemente un código .net escrito en una sintaxis declarativa; el código subyacente es solo C# o VB.net para complementar eso (¡si es absolutamente necesario!)

+0

+1 por el bit sobre ignorar la regla "sin código a la vista". Es más una guía de todos modos. :) –

2

También le gustaría poner una propiedad de cadena ErrorMessage en su clase ViewModel a la que se puede vincular su Vista.