2012-08-21 16 views
8

Estoy tratando de aprender el patrón MVVM (C#), que proviene de un fondo de Windows Forms. Estoy usando el juego de herramientas MVVM Light, y hasta ahora creo que es brillante. He hecho varias aplicaciones pequeñas, sin embargo, una cosa con la que estoy luchando es presentar una segunda vista.MVVM Light - Multiple ViewModels (y los conecta)

Quiero (por ejemplo), tener un botón en mi MainViewModel, que a través de un RelayCommand, abre una nueva ventana, digamos una ventana "Acerca de". He hecho horas de investigación en la web para esto; sin embargo, parece que no puedo obtener mi AboutViewModel para comunicarme con/mostrar mi AboutView.

He colocado un messenger de recepción en el constructor de código subyacente de AboutView.xaml; sin embargo, no puedo conseguir que reciba ningún mensaje del AboutViewModel, y por lo tanto no puede hacer que sea 'Show()'.

Si alguien tiene un ejemplo de una aplicación MVVM Light WPF utilizando múltiples puntos de vista que sería grande :)

+0

Parte de tu código sería muy útil para encontrar una respuesta ... – EtherDragon

Respuesta

0

Como puedo ver que desea una navegación en su MVVM aplicación?

Palabra va al creador de MVVM Light - Laurent Bugnion - con su post sobre el uso de servicios de navegación Views para la conmutación. En realidad, se trata de Windows Phone & Silverlight pero lo mismo debe aplicarse a WPF.

También esta answer en cuestión relacionada utiliza este enfoque.

3

Hay dos maneras que se me ocurre que hacer esto fácilmente

La primera sería la de utilizar un Popup en lugar de un nuevo Window. Por ejemplo, a menudo pongo propiedades en mi ViewModel para PopupContent y IsPopupVisible, y establezco esos valores en cualquier momento que deseo mostrar mi control Popup. Por ejemplo, un comando ShowAboutPopup relé podría ejecutar algo como esto:

void ShowAboutPopup() 
{ 
    PopupContent = new AboutViewModel(); 
    IsPopupVisible = true; 
} 

para poder visualizarlo con un objeto Popup, o una costumbre UserControl. Yo prefiero usar mi propia custom Popup UserControl, que por lo general terminan con este aspecto:

<Window> 
    <Canvas x:Name="RootPanel"> 
     <SomePanel> 
      <!-- Regular content goes here --> 
     </SomePanel> 

     <local:PopupPanel Content="{Binding PopupContent}" 
      local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}" 
      local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" /> 
    </Canvas> 
</Window> 

La propiedad PopupContent es una ViewModel (como un AboutViewModel), y DataTemplates se utiliza contar WPF para dibujar específica ViewModels con específica Views

<Window.Resources> 
    <DataTemplate DataType="{x:Type local:AboutViewModel}"> 
     <local:AboutView /> 
    </DataTemplate> 
</Window.Resources> 

el otro método es tener algún tipo de ApplicationViewModel que se ejecuta en el arranque, y es responsable del estado de aplicación general, que incluye el cual la ventana (s) están abiertas.

Normalmente prefiero tener un solo ApplicationView que contiene una ContentControl para mostrar la página actual

<Window> 
    <ContentControl Content="{Binding CurrentViewModel}" /> 
</Window> 

sin embargo, también se puede utilizar para gestionar varias ventanas. Si lo usa para administrar varios objetos Window, tenga en cuenta que esto no será puro ViewModel, ya que necesitará acceder a algunos objetos específicos de la vista, y al hacer referencia a objetos UI, no es algo que ViewModel debería hacer. Por ejemplo, puede suscribirse para recibir mensajes ShowWindow, y al recibir esos mensajes crearía la Vista especificada y la mostraría, y posiblemente también ocultaría la ventana actual.

Personalmente, trato de evitar varias ventanas tanto como sea posible. Mi método habitual es tener una sola Vista que contenga objetos de aplicación coherentes para cualquier página, y un ContentControl que contenga contenido dinámico que cambie. Tengo un example using this navigation style on my blog si te interesa

+1

+1 por esfuerzo y "arrogancia". –

Cuestiones relacionadas