2012-03-04 4 views
6

Estoy creando una aplicación WPF simple. Tengo una función OpenFile:¿Debo poner esta función en Ver (código subyacente) o en ViewModel?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

Idealmente, ¿dónde debería estar presente esta función? Siento que debería estar en .xaml.cs porque accede a un MessageBox que viene en la parte View. Pero también llama a mi Ayudante, que está en el modelo. Así que también creo que puede estar en el ViewModel. ¿Cuál es la ventaja de tener esto en el View o en el ViewModel? ¿Alguien puede ayudarme con algunos consejos?

Gracias.

Respuesta

7

Una de las ventajas de colocarlo en el modelo de vista sería la capacidad de comprobación. Podría escribir una prueba unitaria que verifique que el cuadro de mensaje solo se muestre si el archivo existe, por ejemplo (más exactamente sería una prueba de integración si está accediendo al sistema de archivos).

Sin embargo, como está utilizando un cuadro de mensaje directamente, su prueba nunca se completará en un servidor de compilación porque la máquina esperaría la entrada del usuario mientras se muestra el cuadro de mensaje.

Por lo tanto, yo trabajaría en contra de una abstracción en su modelo de vista, por lo que puede mock the message box durante las pruebas.

7

Esta función debe estar en ViewModel. Debe crear una operación en su vista para mostrar el mensaje de error y llamar a este método en lugar de MessageBox.Show. Mostrar el cuadro de mensaje debe hacerse en el View.

En general, debe evitar la implementación de cualquier lógica comercial dentro del View, como la validación o el manejo de un archivo.

2

Si está utilizando Microsoft Prism, puede usar la interfaz IInteractionRequest para que la vista cree el MessageBox, pero en realidad devuelva la respuesta necesaria al modelo de vista.

Si usted es no usando Microsoft Prism, entonces observe cómo funciona esta pieza y simúlela o utilice un marco que haga algo similar.


Básicamente, ese código debe ir en su vista-modelo para la capacidad de prueba, pero reemplace la línea donde se llama explícitamente el cuadro de mensaje y utiliza el IInteractionRequest mencionado lugar.

Aquí está la documentación pertinente para el escenario que desea implementar: Chapter 6: Advanced MVVM Scenarios. Consulte la sección indicada Patrones de interacción del usuario.

Cuestiones relacionadas