2009-08-24 20 views
7

Implementé mi mensaje de error MVVM como un diálogo de mensaje que se suscribe a mensajes de error a través de una clase mediadora, para que otros modelos de vista puedan notificarlo si se produce algún error.Ventana de error show modal en MVVM WPF

Cuando se produce un error, establezco el atributo de visibilidad en el modelo de vista en Visible, para mostrar la ventana de error. Todo esto está vinculado en la ventana Error del viewmodel.

Sin embargo, ¡esta ventana NO es modal! Necesito mostrarlo como un diálogo y no solo establecer la visibilidad en verdadero - ¿hay algún tipo de enlace que pueda hacer, incluso si tengo que extender la funcionalidad de la ventana? Prefiero no romper MVVM si puedo evitarlo.

Gracias!

+0

Tal vez a especificar algunas manejador OnvisibilityChanged en el código subyacente de la ventana de error? – bluebit

Respuesta

3

La división Vista/VistaModelo tiene la intención de dividir el aspecto de la funcionalidad. Creo firmemente que la ventana es funcionalidad y mira enrollada en una sola. Por ejemplo, ¿qué pasaría si en su ErrorMessageViewModel, que tenía el código que se ejecuta cuando hay errores:

class WindowViewModel : Window 
{ 
} 

. 
. 
. 

WindowViewModel newDialog = new WindowViewModel(); 
newDialog.Content = myErrorListViewModel; 
newDialog.Parent = mainWindowViewModel; 
newDialog.ShowDialog(); 

Así que los contenidos del diálogo es el modelo de vista para su lista de errores. Define tu vista como una plantilla de datos que se aplica automáticamente a la lista de errores ViewModel.

¿No se parece a MVVM?

El hecho es que la clase Window es un ViewModel para la ventana que se ve en la pantalla. Al cambiar las propiedades del objeto Window, afecta a la "vista" como si las propiedades de WindowView estuvieran vinculadas a un WindowViewModel. Lo único que falta es la capacidad de "cambiar el estilo" de la ventana usando WPF, y no importa qué tan duro intente implementarlo, no podrá hacerlo. El usuario puede cambiar el estilo de una Ventana modificando su tema de escritorio, pero no puede controlarlo. Lo mejor que puede hacer es apagar el cromo y hacer que sea pantalla completa.

+0

¿Cómo harías para probar en unidades un ViewModel de esta manera? – russau

+0

@russau: se supondría que Microsoft ha realizado Pruebas unitarias razonables en la clase Window. Ciertamente puede escribir pruebas unitarias que ejerzan cualquier funcionalidad adicional que escriba en la clase WindowViewModel. –

2

Se puede encontrar un ejemplo de cómo las ventanas (no importan si son modales o no) se muestran, en el ejemplo de modelo de vista de este proyecto:

marco de aplicaciones WPF (WAF)

http://waf.codeplex.com

0

en mi reciente entrada del blog se puede encontrar una solución simple para diálogos modales y cuadros de mensaje en MVVM para Silverlight, pero esto se puede simplemente volver a utilizar en WPF:

Modal dialogs with MVVM and Silverlight 4

+0

He publicado un comentario para su artículo, todavía está esperando la moderación del segundo día. Así que voy a duplicar mi respuesta aquí: "Afirmo que es una decisión independiente de la plataforma, pero hasta donde yo sé, la ventana de WPF tiene el método ShowDialog destinado a mostrarse como diálogo modal. método. Esto no conduciría a un comportamiento modal, ¿verdad? –

1

También estoy trabajando en un proyecto MVVM donde necesito cuadros de diálogo modales o buzones de mensajes. He encontrado la siguiente manera de resolverlo:

El software utiliza una sola ventana. El elemento raíz de diseño es una cuadrícula sin definiciones de filas o columnas. La grilla tiene tres hijos:

  1. Un dockpanel que contiene todos los elementos habituales, como menús, vistas con pestañas, barra de estado, etc.
  2. Una cuadrícula que tiene un fondo gris y una opacidad del 50%. Esto se usa como un velo para cubrir el panel del muelle cuando un cuadro modal está en efecto. La rejilla del velo generalmente se colapsa.
  3. Una cuadrícula que contiene vistas modales, por lo general se contrae.

El viewmodel para la ventana principal tiene un miembro llamado Modal. Si esto es nulo, las dos cuadrículas para el uso modal se colapsan a través de enlace de datos y un convertidor para Visibility.Collapsed.

Cuando el programa quiere mostrar, por ejemplo, un cuadro de mensaje modal, se crea una instancia de un MessageBoxViewModel y se asigna a MainViewModel.Modal. El MessageBoxViewModel tiene un Comando para un botón Aceptar. Este comando plantea un evento que establece MainViewModel.Modal para anular nuevamente.

La rejilla del velo ocluye el DockPanel principal, por lo que no hay controles fuera del control modal que acepten la entrada.

Su programa puede ejecutar una bomba de mensajes hasta que se presione OK, o el comando OK puede disparar el siguiente. Hay muchas maneras de resolver las diferentes necesidades, pero la solución ModelView Model debería ser compatible.

Creo que este es un buen modelo de vista en el modo modal como uno puede esperar.

1

Cometí un comportamiento para vincular algunos diálogos modales al comando.

http://www.clr-namespace.com/post/MVVMModal-dialog-before-running-Command.aspx

<Confirm:Confirm IsConfirm="{Binding ElementName=checkBoxConfirm, Path=IsChecked}" 
Command="{Binding Path=ButtonCommand}" 
CommandParameter="{Binding ElementName=textBoxParameter, Path=Text}" 
ConfirmMessage="Are you sure you want to fire the command?" 
ConfirmCaption="Question" > 
</Confirm:Confirm> 
0

estoy usando el mismo método que a Scott Whitlock.

sólo hay una propiedad más importante establecer:

class ModalDialog: Window 
{ 
} 

. 
. 
. 

var dlg = new ModalDialog { 
    Content = viewModelName, 
    **TopMost = true,** 
    Parent = mainWindowViewModel 
}; 

dlg.ShowDialog();