2017-08-23 93 views
1
的一個實例

我使用的是ViewModelLocator對我的看法,它在引導程序配置了以下方法:如何將多個視圖的一個DataContext設置爲視圖模型

protected override void ConfigureViewModelLocator() 
{ 
    base.ConfigureViewModelLocator(); 

    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>(); 
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>(); 
} 

它工作正常,但讓兩個獨立的我的2個視圖的ViewModel實例。 我希望我的兩個視圖都使用ViewModel的同一個實例。

回答

1

檢查source code顯示在默認情況下創建一個新的實例對每個視圖的問題:

static Func<Type, object> _defaultViewModelFactory = type => Activator.CreateInstance(type); 

棱鏡允許一般定義此爲所有類型的或唯一的特殊類型。第二種情況應該是首選。

ViewModelLocationProvider.Register<ViewA, ViewABViewModel>(); 

只將View和ViewModel的類型鏈接在一起,沒有定義工廠。這意味着爲每個視圖創建一個新實例。要在多個視圖中使用實例,您需要定義工廠方法。創建您的視圖模型

ViewABViewModel vm = new ViewABViewModel(); 

的一個實例,通過返回這個已經準備實例

ViewModelLocationProvider.Register<ViewA>(() => vm); 
ViewModelLocationProvider.Register<ViewB>(() => vm); 

棱鏡現在採取這個實例,而不是創建一個新的註冊您的看法工廠方法。

+0

它的工作原理,謝謝! – SyntaxTerror

1

你可以註冊視圖模型爲單:

protected override void ConfigureViewModelLocator() 
{ 
    base.ConfigureViewModelLocator(); 

    Container.RegisterType<ViewAViewModel>(new ContainerControlledLifetimeManager()); //<-- 
    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>(); 
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>(); 
} 

或使用接受工廠通過@Fruchtzwerg所建議的方法重載。

相關問題