从代码访问MVVM Light ViewModelLocator

本文关键字:Light ViewModelLocator MVVM 访问 代码 | 更新日期: 2023-09-27 18:20:33

我正试图用MVVM Light Toolkit实现一个应用程序,但不知何故,我被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片段似乎对不同的视图模型有一个静态方法。但这些已经不存在了,所以我认为这不是应该走的路。但什么是?或者,如果我想从视图模型访问定位器,我是在做完全违背模式的事情吗?

从代码访问MVVM Light ViewModelLocator

这在一定程度上取决于您如何设置视图模型定位器,但通常您应该使用IOC容器来注册所有不同的ViewModel。

例如,当使用MVVM Light时,它会是这样的:SimpleIoc.Default.Register<MainViewModel>();

因此,当它可用时,您可以在任何其他类中使用它,也可以在另一个视图模型中使用:SimpleIoc.Default.GetInstance<MainViewModel>();

或者,如果你告诉ServiceLocator你正在使用SimpleIoc,它会是这样的:(注册)ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

然后把它拿回来ServiceLocator.Current.GetInstance<MainViewModel>();

Depechie的回答是正确的,建议您使用IoC容器以与ViewModelLocator相同的方式检索ViewModels。

然而,我将提出另一种方法,该方法将以与XAML中相同的方式检索ViewModel。

XAML(Page.XAML)

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

代码(Page.xaml.cs)

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

上面的XAML和Code是等价的。我希望这能帮助您了解应用程序检索ViewModels的过程。