2011-05-13 17 views
6

Tengo dos vistas que comparten una colección observable de cierto viewmodel, pero con diferentes parámetros de vista de colección. ¿Cuál es la forma correcta de implementarlo en MVVM Light? ¿Hay algún soporte para máquinas virtuales no estáticas? ¿Cómo puedo administrar su vida útil y disponer de ellos?Static ViewModels vs installed ViewModels

+0

¿Está utilizando un contenedor DI como Unity o MEF? – PVitt

+0

No, utilizo la plantilla básica de MVVM Light. –

Respuesta

0

Algunos de Laurent examples of MVVM Light hacen uso de un ViewModelLocator con instancias estáticas de ViewModel (tipo singleton). Tenga en cuenta la interfaz ICleanup. Además, las máquinas virtuales no estáticas generalmente deben ser MEFed o construidas en el constructor de View.

0

Para la gestión de ViewModels, generalmente se usa el patrón IOC. En el marco de MVVM Light, es una implementación SimpleIc.

Yo prefiero usar Ninject - http://www.ninject.org/

1

No!

Por defecto, los objetos resueltos de SimpleIoc son singletons. Para evitar esto, debe pasar un identificador único como parámetro del método ServiceLocator.GetInstance.

ver más abajo:

Tenemos dos propiedades que regresan el mismo modelo de vista. Uno devuelve un singleton y el otro devolverá una nueva instancia cada vez.

class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IDataService, DataService>(); 
     } 

     SimpleIoc.Default.Register<MainViewModel>(); 
     SimpleIoc.Default.Register<SecondViewModel>(); 
    } 


    public MainViewModel MainAsSingleton 
    { 
     get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } 
    } 

    public MainViewModel MainAsDiffrentInstanceEachTime 
    { 
     get { return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString()); } 
    } 
} 
Cuestiones relacionadas