2010-03-02 17 views
14

Estoy buscando usar MVVM y aunque lo entiendo en su mayor parte, hay una cosa que no puedo entender.MVVM Pasar datos al cuadro de diálogo Ver modelo

Imagine que tengo una combinación de View y ViewModel que muestra una lista de foobars. Cuando el usuario selecciona un foobar en la lista y hace clic en el botón Editar, quiero que se muestre el foobar en una ventana de diálogo emergente para que se pueda editar. Esta ventana de diálogo (la vista) tendrá su propio ViewModel asociado.

Entiendo que el botón se puede vincular a un comando en la lista ViewModel, pero desde aquí ¿cómo puedo crear una instancia del editor foobar?

1) ¿Debo devolver un mensaje a la Vista, que abrirá la ventana de diálogo? Si es así, ¿esto no derrota el propósito de tener el comando?

2) ¿Cómo pasa el foobar al editor para el ViewModel? Si es por su constructor, ¿no dificulta esto declarar ViewModel en XAML?

Siento que esta es la última pieza del rompecabezas que me impide usar MVVM y realmente me gustaría obtener una buena solución desacoplada para esto.

Gracias Matt

Respuesta

2

será quizá hacerlo de la siguiente manera:

  1. El comando adjunta al botón de edición comienza diálogo de edición, la creación de un modelo de vista personalizada (VM) por ello. El comando en sí debería estar en la VM de la lista o en el Modelo (no del todo seguro).
  2. La máquina virtual del diálogo de edición Foobar obtiene una referencia al Foobar en su constructor.
  3. El foobar se clona y el clon se edita.
  4. Tan pronto como el usuario presiona OK en el cuadro de diálogo de edición de foobar, los valores de la copia se vuelven a escribir en la barra foobar original en la máquina virtual (y el cuadro de diálogo se cierra).

La necesidad de un clon proviene del hecho de que el usuario no quiere ver los cambios en la lista foobar hasta que acepte los cambios en el diálogo de edición. Sin embargo, si la edición en línea está bien, el clon no es necesario.

Los cambios se propagan automáticamente.

PD: aunque soy el proponente de MVVM, no estoy seguro de que mi solución sea ortodoxa desde el punto de vista de MVVM puro.

1

This article de codeproject muestra un control de diálogo WPF que hace exactamente lo que necesita. La razón por la cual esta implementación es necesaria es porque no puede poner una Ventana dentro del árbol visual de ningún otro control. Lo que significa que WPF no le permite crear un cuadro de diálogo dentro de una ventana. Entonces, el artículo anterior crea una subclase ContentControl que crea una ventana.

De todas formas, se pone esto en su FooBarList Ver

<dialog:Dialog Content="{Binding Path=DialogViewModel}" /> 

a asegurarse de que tenga algo como esto en un diccionario de recursos en algún lugar:

<Style TargetType="{x:Type dialog:Dialog}"> 
<Style.Triggers> 
    <Trigger Property="HasContent" Value="True"> 
    <Setter Property="Showing" Value="True" /> 
    </Trigger> 
</Style.Triggers> 
</Style> 

y acaba de escribir algo como esto (para WPF para trabajar debe implementar INotifyPropertyChanged):

public Class FooBarListViewModel 
{ 
    IList<FooBar> FooBarList {get;set;} 
    FooBar SelectedFooBar {get;set;} 
    ViewModelBase DialogViewModel {get;set;} 

    public EditFooBar(object param) 
    { 
    DialogViewModel = FooBar; 
    } 
} 

Para vincular la vida w para editar el FooBar a la FooBar modelo de vista simplemente hacer algo como esto (preferiblemente en las Application.Resources por lo que es mundial)

<DataTemplate DataType={x:Type vm:FooBarViewModel}> 
    <vw:FooBarView/> 
</DataTemplate> 

(u opcionalmente: Utilice un IValueConverter convertir obtener su visión desde un modelo de vista like this post shows)

Y luego está listo. Puede parecer mucho, pero realmente te libera mucho.

+0

Ese es un enfoque interesante. Mirando el proyecto de muestra, me pregunto si me voy a picar al perder algunas de las características de una ventana normal (cambio de tamaño, no modal, etc.). Estoy empezando a pensar que me valdría la pena considerar un diseño que no requiera cuadros de diálogo complejos en absoluto, y quizás tener una aplicación MDI en su lugar. ¿Cuáles son sus pensamientos sobre esto? – Matt

0

Lo que falta es un controlador que es responsable del flujo de trabajo de ViewModels. El Controlador crea los ViewModels y pasa los datos necesarios entre ViewModels. El proyecto WPF Application Framework (WAF) contiene aplicaciones de ejemplo que muestran cómo podría funcionar.

Cuestiones relacionadas