2011-05-13 69 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()); } 
    } 
}