2010-04-19 8 views
6

Tengo la siguiente pregunta con respecto a la luz MVVM: ¿qué "impulsa" la IU? Veo que puedo mostrar un ViewModel por Vista; ViewLocator maneja todos los ViewModels (para el almacenamiento en caché, según tengo entendido). Pero, ¿qué está impulsando la UI?¿Necesito un controlador de vista para MVVM-light en Silverlight?

Si tengo un comando definido en mi ViewModel que dice "Mostrar detalles"; ¿Tengo que escribir el código para mostrar esta Vista dentro de ViewModel?

¿Hay algún ejemplo de esto? ¡Gracias!

Respuesta

1

En MVVM, lo que "controla" la vista es el enlace de datos. Puede conectar la Vista al ViewModel configurando el DataContext de la Vista para apuntar al modelo de vista.

ejemplo sencillo (usando MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase 
{ 
    (...) 
    private string _myProperty; 
    public string MyProperty { 
     get { return _myProperty; } 
     set { 
      _myProperty = value; 
      RaisePropertyChanged("MyProperty"); 
     } 
    } 
} 

MyView.xaml.cs

void MyView() { 
    DataContext = new MyViewModel(); 
} 

MyView.xaml

<TextBlock Text="{Binding MyProperty}" /> 
+1

Mis preguntas estaban más relacionadas con la carga de diferentes vistas. Entiendo el mecanismo de enlace con un ViewModel. ¿Pero dónde escribo el código para mostrar una nueva Vista cuando el usuario ejecuta, por ejemplo, el botón "Mostrar detalles"? –

5

El MVVM patrón en sí mismo no tiene Ve algo específico para la navegación entre vistas. Aunque hay muchas soluciones para eso en varios marcos. La solución más común es utilizar algún tipo de controlador que "orquesta" la Vista principal, o utilizar un enfoque de "Detalle maestro" para las subvistas.

Algunas soluciones interesantes:

1

He creado una plantilla T4 tha t genera código y muestra cómo navegar a un uri u objeto, o cierra una ventana (wpf). Funciona con luz MVVM

Download here

0

Creo que se puede consultar cincha V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

que parece prometedora tranquila. Sin embargo, creo que la mayoría de estos marcos son bastante difíciles.

Implementé una solución con un enfoque MVVM simple con algún tipo de patrón de controlador de supervisión que maneja la comunicación entre Vistas y Modelos de Vista.

0

Le recomendaría que realice una lectura en el sistema de mensajería en el juego de herramientas MVVM light. Este parece ser el enfoque más simple que he encontrado para lograr esto.Aquí está un ejemplo de cómo funciona:

Si usted tiene 2 modelos de vista - 1 para los clientes que buscan, el otro para mostrar los detalles sobre el cliente seleccionado:

En primer modelo de vista, tiene una propiedad como esto:

public string CustomerID 
    { 
     get 
     { 
      return _customerid; 
     } 

     set 
     { 
      if (_efolderid == value) 
      { 
       return; 
      } 

      var oldValue = _customerid; 
      _customerid = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged("CustomerID", oldValue, value, true); 
     } 
    } 

Luego, en el segundo modelo de vista, se registra para recibir los mensajes cuando este valor cambia de la otra, como este:

void registerForMessages() 
    { 
     Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
      (pcm) => 
      { 
       if (pcm.PropertyName == "CustomerID") 
       { 
        customerID = pcm.NewValue; 
        AddWorkplanCommand.RaiseCanExecuteChanged(); 
        loadCustomerDetails(); 
       } 
      }); 
    } 

Sé asegúrese de llamar a su función registerForMessages() en el constructor del segundo modelo de vista. Otra cosa que ayuda es a crear un mapa de clases cuando tienes 4 o más ViewModels en tu aplicación. Encuentro que es fácil construir uno en un archivo de texto rápido en la solución para hacer un seguimiento de todos los mensajes y lo que se pretende lograr, y qué otros modelos de vista están registrados para recibirlos.

Una de las cosas realmente buenas de esto es que tiene 1 viewmodel envía una notificación de cambio, como la propiedad customerID modificada, y de inmediato tienen 4 viewmodels adicionales que reciben ese cambio y todos comienzan a cargarse ellos mismos.

Cuestiones relacionadas