2011-05-13 68 views
6

我有两个视图共享某个viewmodel中的一个可观察集合,但具有不同的集合视图参数。在MVVM Light中实现它的正确方法是什么?是否支持非静态虚拟机?我如何管理他们的一生并处理他们?Static ViewModels vs instanced ViewModels

+0

您是否使用了DI容器,如统一或MEF? – PVitt 2011-05-13 10:49:05

+0

不,我使用基本的MVVM Light模板。 – 2011-05-13 10:49:59

回答

0

一些Laurent的examples of MVVM Light使用带静态视图模型实例(单式)一ViewModelLocator的。请注意0​​接口。此外,非静态虚拟机通常必须在视图的构造函数中进行MEFed或构建。

0

对于ViewModels管理通常使用IOC模式。在MVVM Light框架中,它是一个SimpleIoc实现。

我更喜欢使用Ninject - http://www.ninject.org/

1

有!

默认情况下,从SimpleIoc解析的对象是单例。为了解决这个问题,你需要传递一个唯一的标识符作为ServiceLocator.GetInstance方法的一个参数。

见下文:

我们有两个属性返回相同的视图模型。一个返回一个单例,另一个将每次返回一个新的实例。

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()); } 
    } 
}