2010-09-20 13 views
6
usuarios

Hola compañeros Stackoverflow (o Stackoverflowers?):WPF MVVM Dudas

estoy aprendizaje mediante la codificación de WPF. Leí varios artículos/vi varios screencasts, y viniendo de un fondo de desarrollo WEB, activé VS2010 y comencé a hacer una aplicación de muestra que me ayudaría a aprender los conceptos básicos.

También leí algo sobre MVVM y comencé a usarlo. Configuré mi solución para usar WPF 4.0, ActiveRecord 2.1 y SQLite, y todo fue muy bien. Pero todavía tengo algunas dudas:

  • he creado un MainWindowViewModel, y estoy usando la clase de RelayCommand here a ... retransmitir el comando. ¿Estoy rompiendo las directrices al tener un elemento de menú de MainWindow para que su comando se vincule a una propiedad de este modelo de vista?

  • Esta acción Estoy vinculando el comando MenuItem para crear una instancia de un nuevo ViewModel y una nueva Vista, y mostrarlo. De nuevo, ¿está bien en el contexto de MVVM?

  • Mi MainWindow será una especie de "tablero", y tendré más de un modelo conectado a este tablero. ¿Debería simplemente envolver todos esos modelos en un modelo de vista única?

Algo como esto:

public class MainWindowViewModel { 

    private ObservableCollection<Order> openOrders; 
    private Address deliveryAddress; 
    private Order newOrder; 
    /* Wrappers for the OpenOrders Collection */ 
    /* Wrappers for Delivery Address */ 
    /* Wrappers for New Order */ 
    /* Command Bindings */ 

} 

TIA!

+0

Algunas personas se refieren a los usuarios de StackOverflow como Stackers –

+0

@Eduardo, wtaniguchi: ver [este debate] (http://meta.stackexchange.com/questions/6254/what-should-the-users-of-stack- overflow-be-called) en meta –

Respuesta

6

Creé un MainWindowViewModel, y estoy usando la clase RelayCommand desde aquí para ... transmitir el comando. ¿Estoy rompiendo las directrices al tener un elemento de menú de MainWindow para que su comando se vincule a una propiedad de este modelo de vista?

No, no está rompiendo ninguna directriz. Es perfectamente apropiado para obligar a la Menultem a un comando de la MainWindowViewModel (donde más se puede poner este comando de todos modos?)

Esta acción Estoy vinculante el comando Menultem al que se va a crear una instancia de un nuevo modelo de vista y una nueva Ver y mostrarlo. De nuevo, ¿está bien en el contexto de MVVM?

Está perfectamente bien crear un nuevo ViewModel, por supuesto. En cuanto a la creación de una nueva vista, depende de cómo la cree ... por supuesto, nunca instanciar una vista explícitamente desde ViewModel, ya que introduciría una dependencia de la máquina virtual a la vista.

Mi MainWindow será una especie de "tablero", y tendré más de un modelo conectado a este tablero. ¿Debería simplemente envolver todos esos modelos en un modelo de vista única?

Depende de lo que entendemos por "envolver" ... Su MainWindowViewModel podría exponer otros ViewModels través de las propiedades, y tesis máquinas virtuales se mostrará en diferentes partes de la vista. Si eso es lo que quieres decir, sí, debes envolverlos.

+0

gracias por su respuesta. Para la segunda respuesta, estaba pensando exactamente sobre eso al hacer la pregunta. Asumiendo que no llamaría explícitamente "new SomeView();", ¿cómo debería llamar a otra vista desde un viewmodel? Sobre la tercera respuesta, necesitaría exponer los ViewModels que necesitaría para diferentes partes de la Vista, y usar un UserControl + un ResourceDictionary para renderizar ese tipo, y vincular la VM expuesta a él. – wtaniguchi

+0

Para el 2º punto, normalmente utilizo un ContentControl que selecciona el DataTemplate apropiado según el tipo de viewmodel. Para la 3ª: sí, exactamente –

+0

Ok! ¡Gracias! ¡Creo que tengo un mejor entendimiento ahora, y trabajaré mis pensamientos sobre estos problemas! – wtaniguchi

3

Agregando a la respuesta de Thomas:

me gustaría crear diferentes controles de usuario para cada parte del salpicadero y asignar un modelo de vista a cada control de usuario.

2

Creé un MainWindowViewModel, y estoy usando la clase RelayCommand desde aquí para ... transmitir el comando. ¿Estoy rompiendo las directrices al tener un elemento de menú de MainWindow para que su comando se vincule a una propiedad de este modelo de vista?

No, ahí es exactamente donde pones los comandos.

Esta acción Estoy vinculando el comando MenuItem para crear una instancia de un nuevo ViewModel y una nueva Vista, y mostrarlo. De nuevo, ¿está bien en el contexto de MVVM?

No debería necesitar saber cómo crear una nueva vista; ese es el trabajo de la vista Los detalles de cómo hacer esto dependen de cómo muestre esta nueva vista; podría ser tan simple como tener un ContentPresenter en la vista que esté vinculado a una propiedad en el modelo de vista, por lo tanto, cuando configure la propiedad (y suba PropertyChanged) ContentPresenter representa el nuevo objeto con su DataTemplate relacionado.

Las cosas se ponen un poco feas si con "instanciar una nueva vista" te refieres a "abrir una nueva ventana". No hay una manera especialmente elegante de hacerlo, especialmente si desea que la nueva ventana sea un diálogo modal. Una forma es agregar un controlador de eventos al código subyacente de la vista que escucha PropertyChanged en el modelo de vista; cuando se establece la propiedad del modelo de vista subordinada, el código en la vista crea y muestra la nueva ventana.

Mi MainWindow será una especie de "tablero", y tendré más de un modelo conectado a este tablero. ¿Debería simplemente envolver todos esos modelos en un modelo de vista única?

Sure. Ese es un patrón muy común. No es poco común, por ejemplo, exponer una propiedad de colección observable y vincularle un ItemControl de algún tipo; la vista creará automáticamente vistas para cada modelo de vista que coloque en esa colección. Nuevamente, la implementación específica realmente depende de su aplicación.