Hay dos buenas maneras de hacer esto: 1) un servicio de diálogo (fácil, limpio) y 2) vista asistida. Ver asistido proporciona algunas características interesantes, pero generalmente no vale la pena.
SERVICIO DE DIÁLOGO
a) una interfaz de servicio de diálogo como vía constructor o algún contenedor de dependencia:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Su implementación de IDialogService debería abrir una ventana (o inyectar algún control en la ventana activa), crear una vista correspondiente al nombre del tipo dlgVm dado (usar registro o convención de contenedor o un ContentPresenter con plantillas de datos asociadas al tipo). ShowDialogAsync debería crear una TaskCompletionSource y devolver su .Task proptery. La clase DialogViewModel en sí misma necesita un evento que pueda invocar en la clase derivada cuando desee cerrar, y mirar en la vista de diálogo para cerrar / ocultar el diálogo y completar el TaskCompletionSource.
b) Para usar, simplemente llame a await this.DialogService.ShowDialog (myDlgVm) en su instancia de alguna clase derivada de DialogViewModel. Después de esperar el regreso, observe las propiedades que ha agregado en su máquina virtual de diálogo para determinar qué sucedió; Ni siquiera necesita una devolución de llamada.
VISTA ASISTIDA
Esto hace que tu vista escuche un evento en el modelo de vista. Todo esto podría estar envuelto en un Comportamiento de mezcla para evitar el código detrás y el uso de recursos si así lo desea (FMI, subclase la clase "Comportamiento" para ver una especie de propiedad adjunta Blendable en esteroides). Por ahora, haremos esto manualmente en cada vista:
a) Cree un OpenXXXXXDialogEvent con una carga personalizada (una clase derivada de DialogViewModel).
b) Haga que la vista se suscriba al evento en su evento OnDataContextChanged. Asegúrese de ocultar y cancelar la suscripción si el valor anterior! = Nulo y en el evento Descargado de Windows.
c) Cuando se active el evento, haga que la vista abra su vista, que podría estar en un recurso en su página, o podría ubicarla por convención en otro lugar (como en el enfoque del servicio de diálogo).
Este enfoque es más flexible, pero requiere más trabajo para usar. No lo uso mucho. La única ventaja agradable es la capacidad de colocar la vista físicamente dentro de una pestaña, por ejemplo. He usado un algoritmo para colocarlo en los límites del control de usuario actual, o si no es lo suficientemente grande, atravesar el árbol visual hasta que se encuentre un contenedor lo suficientemente grande.
Esto permite que los cuadros de diálogo estén cerca del lugar donde se usan realmente, solo atenúa la parte de la aplicación relacionada con la actividad actual y permite que el usuario se mueva dentro de la aplicación sin tener que empujar los cuadros de diálogo manualmente, incluso tener múltiples cuasi Los cuadros de diálogo modales se abren en diferentes pestañas o subvistas.