2012-06-21 28 views
19

¿Alguien puede explicar cómo están conectadas View y ViewModel? No puedo encontrar en ninguna parte el xaml o el xaml.cs para la Vista que hace referencia al ViewModel, ni nada en el archivo ViewModel.cs que hace referencia a la Vista, sin embargo, están conectados de alguna manera y los miembros vinculantes del ViewModel a la Vista funcionan .¿Cómo sabe una vista qué ViewModel usar en WPF?

Además, en el constructor de cada uno, solo existe InitializeComponent para la Vista y un constructor básico para ViewModel (sin declaración/definición de la Vista).

Gracias!

+0

Dado que no está claro si está utilizando un marco de MVVM de terceros, sospecho que deberá publicar algún código para obtener una respuesta precisa. Usted * podría * conectar la vista y el modelo de vista en cualquiera de docenas de maneras diferentes, y no podemos ver qué código tiene delante de usted. –

+0

Recomiendo volver a lo básico: escribí una serie sobre MVVM que realmente cubre algunos de los fondos, como "qué es un modelo de vista" y "cuál es la vista" y cómo se unen. Vale la pena robar: http: // reedcopsey.com/series/windows-forms-to-mvvm/ –

Respuesta

27

Hay varias opciones aquí.

Algo tiene que establecer la Vista DataContext para que sea una instancia de ViewModel. Hay muchas opciones aquí:

  • Esto se puede hacer directamente en xaml (la Vista solo instancia directamente el ViewModel).
  • Esto se puede hacer en el constructor de la vista (this.DataContext = new MyViewModel();)
  • Esto puede ser manejado a través de un DataTemplate
  • A "coordinación" clase puede cablear estos juntos (es decir: una clase de "presentador" separado puede construir tanto y conjunto la DataContext apropiadamente)

el más común son o bien tener la vista definir la VM en el xaml (View-primero), o tener todo basado desde un punto de vista ViewModel centrada, y tienen WPF crear automáticamente la Vista basada en la VM enlazada (ViewModel-first).

El enfoque anterior es el que utilizan muchos kits de herramientas, como MVVM Light. El último enfoque es el que utilicé en mi MVVM blog series, y utilizado por algunos otros kits de herramientas.

+0

+1. Esta clase de "coordinación" se suele llamar "Controlador" (patrón MVC) o "Presentador" (patrón MVP) donde el presentador actúa como controlador y como modelo de visualización al mismo tiempo. Ir hacia MVP significaría que 'ViewModel' abriría la vista. –

+0

@ OlivierJacot-Descombes a menos que use plantillas de datos; de esta forma, la VM necesita abrir vistas. –

+0

@DannyVarod Si usa plantillas de datos, WPF se convierte efectivamente en el "Presentador" en términos de MVP coordinando esto para usted. –

1

La vista contiene un objeto de la clase de modelo de vista en el xaml.

La función InitializeComponent crea todos los controles en la página, define los estilos, etc.

+0

¿Dónde estaría? No puedo encontrar ningún texto que contenga la palabra "ViewModel" (así se llama mi modelo de vista). –

+0

Es posible que desee ver la respuesta de Reed. La forma en que lo hago es tener un objeto de mi modelo de vista en el xaml de la Vista. – Justin

4

Una forma "limpia" para la conexión de los puntos de vista a la vista de los modelos sería ...

Al crear los puntos de vista, para cada vista, establezca su fuente de datos a la vista-modelo:

P.ej

public class App 
{ 
    private void OnAppStart() 
    { 
     var model = new MainModel(); 
     var vm = new MainVM(); 
     var view = new MainWindow(); 

     vm.Model = model; 
     view.DataSource = vm; 

     view.Show(); 
    } 
} 

Cuando el modelo que está viendo los cambios, actualizar la máquina virtual:

public class MainVM 
{ 
    private void OnSelectedModelItemChanged() 
    { 
     this.SelectedItem = new ItemVM(); 
     this.SelectedItem.Model = this.SelectedModelItem; 
    } 
} 

Y el uso de plantillas de datos para hacer Ver las opiniones sub correctos para cada máquina virtual.

Cuestiones relacionadas