Normalmente me encargo de esto creando algún tipo de WindowViewLoaderService. Cuando el programa inicializa se registra de su ventana y sus ViewModels con código de algo como esto:
WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel);
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel);
A continuación, cuando se puede, por ejemplo, llamar a este servicio de su modelo de vista y todo lo que tiene que hacer referencia a otra es su modelo de vista. Por ejemplo, si usted está en su MainWindowViewModel es posible que tenga un código como éste:
var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM)
El WindowViewLoaderService sería entonces buscar lo que Vista está asociada con el modelo de vista determinado que ha pasado la misma. Creará esa Vista, establecerá su DataContext en el ViewModel que pasó, y luego mostrará la Vista.
De esta forma, su ViewModels nunca sabe acerca de ninguna vista.
Puede transferir uno de estos servicios con bastante facilidad. Todo lo que necesita hacer es mantener un Dictionary con la clave siendo su ViewModelType y el valor siendo su ViewType. El método Register se agrega a su diccionario y el método ShowWindow busca la vista correcta en función del ViewModel pasado, crea la vista, establece el DataContext y luego llama a Show en él.
La mayoría de los marcos de MVVM proporcionan algo como esto para ti de la caja. Por ejemplo, Caliburn tiene una elegante que solo usa la convención de nomenclatura, se llama ViewLocator en este Framework. Aquí hay un enlace que resume: http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx
la cincha en el otro lado lo llama un WPFUIVisualizerService que se puede ver en acción aquí: http://www.codeproject.com/KB/WPF/CinchIII.aspx
Estos deben ayudar a obtener rodando.
No estoy de acuerdo con que el código de vista detrás de los archivos "debería estar vacío". Si bien hay muchas cosas que NO deberían estar detrás del código, todavía tienen valor. Lo uso para cualquier cosa que sea específica para la capa de Vista, como la administración del control de Enfoque. También lo uso para abrir ventanas posteriores en WPF. –
+1 para Joel. La implementación MVVM significa que VER código ESPECÍFICO es el ÚNICO código que debería estar en el código subyacente. Su modelo de vista no debería tener que manejar cosas como cambios de estado de VSM (a menos que, tal vez, estos cambios sean impulsados por datos, en cuyo caso lo incluiré en un comportamiento o disparador expuesto en el nivel VM) –
Gracias por sus comentarios chicos. .. ellos realmente aclararon algunas cosas para mí. – Sheridan