2009-06-21 7 views
6

Me gusta la idea de MVVM de RelayCommand expuesta por ViewModel. Eso es agradable y elegante, para las operaciones que se pueden hacer sin más aportaciones del usuario. Sencillo. TestableMVVM y comandos que muestran más GUI

Sin embargo, no todas las operaciones son UI-less. Algunos requieren confirmación ("¿Estás seguro de que deseas eliminar?"). Otros requieren más información todavía. Abrir un archivo puede implicar cualquier cosa, desde un diálogo Abrir archivo hasta un Asistente de importación completo.

¿Cuál es la mejor manera, dentro de una aplicación MVVM, para escribir comandos que requieren la entrada del usuario? ¿Existe un patrón establecido para resolver esto con la inyección de dependencia de alguna manera? ¿Debo escribir un controlador KeyDown en el código subyacente y hacer que ejecute explícitamente el evento? ¿Debo recurrir a RoutedUICommand y poner todo el código "mostrar la siguiente GUI" en mi vista? ¿O hay algo obvio que me estoy perdiendo por completo?

Respuesta

4

Normalmente uso Dependency Injection para inyectar algún tipo de cosa abstracta de IShowTheInterface, y luego invoco métodos en la abstracción desde dentro del Comando. Estos métodos deberían darle las respuestas que necesita para determinar si continuar o no con la acción, y qué entrada dio el usuario.

Hace poco utilicé esto como ejemplo en un blog post with a bit of a different topic.

1

Este tipo de cosas (cuadros de diálogo de confirmación, diálogos de archivos abiertos, etc.) suelen compartirse entre aplicaciones. Entonces mi preferencia no es ponerlos en ViewModel en absoluto.

ViewModel es específico de la aplicación, y no es una buena idea expandir ViewModelBase indefinidamente. En su lugar, crea comportamientos reutilizables para extender la Vista. Hay Quête algunas muestras de conducta en el Expression Blend Gallery

EDIT:

comportamientos pueden tener propiedades y puede utilizar estas propiedades no sólo para especificar las características de comportamiento, sino también para obtener alguna información:

<Button Content="Open Document"> 
    <i:Interaction.Behaviors> 
     <local:FileOpenBehavior 
      FileNameTarget="{Binding ElementName=tbDocName}"/> 
    </i:Interaction.Behaviors> 
</Button> 

En el ejemplo anterior, tbDocName puede ocultarse, o puede vincularse a una propiedad de su ModelView.

+0

La parte "mostrar un diálogo abierto" puede ser reutilizable; pero entonces necesitas hacer algo con ese archivo, y eso va a ser específico de la aplicación, así que no estoy seguro de ver cómo funciona esto. ¿Puedes dar un ejemplo de cómo lo harías con los comportamientos? –

+0

@ joe-white Envía un mensaje enrutado a la pila de la interfaz de usuario que será capturado y retransmitido a un modelo de vista ... O si te vinculas a una propiedad en un modelo de vista, sabrás que el archivo se asigna cuando la propiedad cambia. –