2015-11-03 92 views
2

我想用MVVM Light Toolkit實現一個應用程序,但我不知何故卡住了ViewModelLocator。代碼訪問MVVM Light ViewModelLocator

雖然我很清楚如何從XAML中的視圖和視圖的代碼隱藏中訪問它,但我從其他視圖模型訪問它時遇到一些問題。

在App.xaml中:

<Application.Resources> 
    <vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:MvvmLight1.ViewModel" x:Key="Locator" /> 
</Application.Resources> 

在查看:

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}" 

但如何從其他視圖模型訪問例如MainViewModel? 看來以前版本的ViewModelLocator片段對不同視圖模型有一個靜態方法。但那些不再存在,所以我認爲這不是要走的路。但是什麼?或者,如果我想從視圖模型訪問定位器,我是否完全針對該模式進行了一些操作?

回答

9

取決於您如何設置視圖模型定位器,但通常您應該使用IOC容器來註冊所有不同的ViewModels。

例如使用MVVM光的一個時,它會是這樣: SimpleIoc.Default.Register<MainViewModel>();

所以,當這是可用的,你可以使用任何其他類 - 所以以另一種視圖模型使用: SimpleIoc.Default.GetInstance<MainViewModel>();

或者,如果你告訴你正在使用的SimpleIoc它的ServiceLocator會是這樣: (在登記) ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

並獲得回來 ServiceLocator.Current.GetInstance<MainViewModel>();

+1

是的,這種代碼是在ViewModelLocator中。 所以你的建議是直接使用SimpleIoc而不是類ViewModelLocator? – MuhKuh

+1

是的,因爲這就是爲什麼你將Ioc添加到第一個位置:)用於'注入',以便在任何其他類中使用這些類實例。 – Depechie

+4

psst接受答案會很好:) – Depechie

1

Depechie的回答是正確的,提示您使用IoC容器以與ViewModelLocator相同的方式檢索ViewModel。

然而,我會提出另一種方法,將檢索ViewModel的方式,就像它在你的XAML中完成。

XAML(Page.xaml)

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}" 

代碼(Page.xaml.cs)

this.DataContext = App.Current.Resources["Locator"] as ViewModelLocator).ViewModelName 

上述XAML和代碼件是等價的。我希望這可以幫助您理解應用程序檢索ViewModels的過程。