2009-11-26 5 views
11

¿Podría dar un ejemplo de cómo usaría (su infraestructura de DI favorita) para conectar Modelos de Vista MVVM para una aplicación WPF?¿Cómo puedo combinar MVVM y Dependency Injection en una aplicación WPF?

¿Creará una jerarquía de modelos de vista fuertemente conectada (como donde cada ViewModel de control anidado es una propiedad en el ViewModel de un padre y lo vinculará al DataContext del control anidado en XAML) o usaría algún tipo de aún más -abstraer "" View Model "Manager", que mantiene alguna jerarquía débilmente conectada ... como en CAB, tal vez?

Respuesta

6

Si un modelo de vista solo puede existir junto con otro, creo una relación sólida. Ese es el modelo de vista propietario que tendrá una referencia directa a uno o más de los modelos de vista dependientes. Si, por otro lado, un modelo de vista debe poder existir con o sin otro, tomo un enfoque poco flexible donde se comunican a través de un bus de eventos.

En términos de usar DI con MVVM, absolutamente puede combinar los dos. Es tan simple como:

public class MyViewModel 
{ 
    private readonly IMyDependency _myDependency; 

    public MyViewModel(IMyDependency myDependency) 
    { 
     _myDependency = myDependency; 
    } 
} 

Tenga en cuenta, sin embargo, que esto supone una "vista de modelo de primera" enfoque de MVVM, que tiene sus inconvenientes.

+1

Debo decir que no soy un gran admirador de ViewModels 'activos' ... Es difícil encontrar un argumento racional de una frase para esto, pero creo que estoy en 'ViewModels should be pasive' 'camp ... –

+1

¿Qué quiere decir con' activo '/' pasivo 'Ver modelo, marca? –

+1

@Yacoder: el ejemplo de Kent Boogaart es un modelo de vista "activo" porque requiere una dependencia, y se debe suponer que tiene la intención de usar esa dependencia de forma activa. Un ViewModel "pasivo", por otro lado, es uno que usted crea y completa con datos, y una vez que lo haya hecho, es autónomo. –

3

En WPF, normalmente es bastante fácil y realmente no depende de ningún contenedor DI en particular. ¿Has leído Josh Smith's article on MVVM? Más o menos describe cómo configurar una jerarquía de ViewModels.

Lo que no entra mucho es cómo crear esos ViewModels a partir de dependencias (como Repositorios), pero no es una extrapolación difícil de hacer.

A menudo he experimentado que el uso liberal de Abstract Factories ayuda bastante a este respecto. En lugar de actualizar directamente ViewModels, dejo que una Factory inyectada lo haga por mí.

Puede usar DI de Poor Man o cualquier tipo de Contenedor DI para cablear tales Fábricas por usted.

+0

Seguramente he leído el artículo, pero no lo hace t entrar en detalles sobre cómo crear y mantener un conjunto más grande de modelos de vista con varias dependencias en cada uno. Me temo que su respuesta no es útil para mí ( –

+0

@Yacoder: Se sorprendería de cuántas personas usan el término MVVM aquí en StackOverflow sin haber leído el artículo. –

+0

Thx para el puntero, es un artículo excelente. – Mathias

1

Publiqué this article on Code Project sobre cómo hacer una aplicación WPF extensible utilizando MVVM y MEF para la extensibilidad. Sin embargo, si te fijas bien, usé MEF para DI también.

La aplicación es completamente MVVM y solo usa DataTemplates (y la ventana ocasional) para Views, al igual que en el artículo de Josh Smith. WPF se encarga de aplicar la Vista correcta a la ViewModel correcta por usted. Es dulce.

Utiliza MEF para que las piezas puedan "encontrarse" entre sí. Por lo tanto, ViewModel para el elemento de menú "Ver" encuentra todos los elementos del menú que se supone que están en el submenú usando puntos de extensión, y los Modelos de Vista para cada uno de ellos "encuentran" el Modelo de Vista que deben entregar al administrador de diseño utilizando puntos de composición. También "encuentran" el servicio de administrador de disposición utilizando un localizador de servicios rudimentario (MEF). El ejemplo del menú Ver es casi exactamente de lo que está hablando con ViewModels anidados. Lo bueno es que ni siquiera se conocen entre sí hasta el tiempo de ejecución.

Cuestiones relacionadas