La mejor manera de cerrar la ventana con mefedmvvm
Pregunta
En mi aplicación tengo unawindow que importa sobre mefedmvvm el ViewModel:
xmlns:mefed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
mefed:ViewModelLocator.ViewModel="MainViewModel"
Y ahora también tengo mi modelado ViewModel que se da cuenta del Modelo View:
[ExportViewModel("MainViewModel")]
public class MainViewModel: ViewModelBase
En mi ViewModel tengo una propiedad iCommand para cerrar la ventana. El evento para el cierre de lata viene de cualquier lugar. Y con la ayuda del Cinch Framework 2.0, me doy cuenta de un SimpleCommand con Execute Methode.
Pregunta
¿Cómo puedo cerrar la ventana de mi Methode de ejecución? Durante la inyección de dependencia no tengo un constructor, no puedo registrar un evento o dar la vista como parámetro al Modelo View.
Editar
Sin embargo, una posibilidad que creo que no es buena:
Llame a esto en el methode
Application.Current.MainWindow.Close()
Solución
Puedes lograr esto escribiendo un ICommand
que pasa el Window
instancia en como parámetro.
Un buen ejemplo está disponible aquí: ¿Cómo puedo asignar el comportamiento de 'Cerrar a escapar de la tecla de escape' a todas las ventanas WPF dentro de un proyecto?
En esa publicación el ICommand
finalmente está vinculado a un KeyBinding
(de modo que la tecla de escape se pueda usar para cerrar la ventana) pero podría unir el comando a cualquier botón o invocarlo desde cualquier lugar dentro de la vista. La parte importante es usar un RelativeSource
En su parámetro de comando, vinculación de parámetro para hacer referencia al Window
que quieres cerrar
Editar en respuesta a los comentarios
El comando es un singleton, pero no hay ningún requisito para que sea, es solo un singleton porque es apátrico y facilita la vinculación. Adquiere una referencia al Window
a través de la vinculación, así que para un UserControl
puedes usar:
<Button Command="{x:Static mynamespace:CloseWindowCommand.Instance}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Content="Close My Parent Window" />
Poder llamarlo desde el código del modelo de vista es un poco más complicado y necesita un enfoque diferente; Se puede encontrar un buen ejemplo aquí: http://gallery.expression.microsoft.com/windowcloseBehavior