2011-01-11 36 views
5

alt textacceso MVVM vista padre modelo desde dentro de la colección

La imagen de arriba ilustra mi programa. Las flechas indican Binding.

Mi MainWindow.xaml tiene su datacontext establecido como MainVM.

La ventana tiene un control de pestaña enlazado a ObservableCollection de ViewModel s. Con una plantilla de datos, el control de pestañas muestra las vistas correspondientes al ViewModel.

El ObservableCollection se encuentra en MainVM.

¿Cómo puedo acceder a las propiedades encontradas en MainVM desde ViewModel (incluido en ObservableCollection)?

Estoy abierto a las respuestas que requieren una modificación de mi modelo de programación.

Respuesta

6

Basándose en lo que dijo Kent. . .

Desde un punto de vista arquitectónico, su clase ViewModel no debería necesitar saber nada acerca de MainVM. Todo lo que necesite saber se debe pasar a la instancia de ViewModel para que pueda permanecer atómico y no tener que preocuparse por las cosas que lo llamen. Desde un punto de vista SÓLIDO, este es el principio de Inversión de Dependencia.

Cualquier propiedad de MainVM que deba accederse dentro de ViewModel se debe pasar como parte de la construcción de la instancia de ViewModel. Personalmente, soy fan de incluirlos en un constructor, pero también podrías exponerlos como propiedades.

Un método de overkill (que no recomiendo), está configurando su constructor para tomar una instancia de MainVM, y pasar el this en el constructor. ej .:

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

entonces cuando se crea el modelo de vista que sólo puede:

ViewModel vm = new ViewModel(this); 
+1

he cambiado de programa para trabajar con el principio de dependencia Inversion.Ahora, en lugar del MainVM que contiene la propiedad, mis ViewModels contienen la propiedad y se mantienen sincronizados a través de MainVM. –

+0

¿Por qué es exagerado? Estoy de acuerdo con la idea de máquinas virtuales atómicas, pero el tipo similar de relación principal está en el ejemplo en la fila ((DataRow)). –

2

¿Quién crea instancias de ViewModel? Si existe una estrecha relación entre MainVM y ViewModel, entonces quizás ViewModel tome una instancia de MainVM en su constructor.

La alternativa es crear un diseño diferente que no requiera ViewModel para tener acceso al MainVM. Hacerlo requeriría más información (y una pregunta por separado).

4

Dependiendo de la interacción que necesite, podría ir por el otro lado disparando eventos de la clase ViewModel y haciendo que MainVM los maneje y establezca propiedades en el ViewModel individual en consecuencia.

Otra opción sería cuando se instancia la Colección modelo de vista (que supongo que se hace en algún lugar MainVM?), Sólo podía pasar en MainVM como un parámetro de constructor y mantener e instancia de MainVM interior de cada ViewModel.

Cuestiones relacionadas