从代码中访问MVVM Light ViewModelLocator

3

我正在尝试使用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片段似乎有一个静态方法来处理不同的视图模型。但是,这些已经不存在了,所以我认为这不是正确的方法。那么应该怎么做呢?如果我想从视图模型访问定位器,是否完全违反了模式?

2个回答

11

取决于你如何设置视图模型定位器,但通常情况下,您应该使用IOC容器来注册所有不同的ViewModels。

例如,当使用MVVM Light之一时,会像这样: SimpleIoc.Default.Register<MainViewModel>();

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

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

并且将其取回 ServiceLocator.Current.GetInstance<MainViewModel>();


2
是的,这种代码位于ViewModelLocator内部。所以您的建议是直接使用SimpleIoc而不是ViewModelLocator类? - MuhKuh
2
是的,因为这就是你首先添加Ioc的原因 :) 用于“注入”,以便在任何其他类中使用这些类实例。 - Depechie

4

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

然而,我提出另一种方法,将以与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 和代码片段是等效的。希望这能帮助你理解应用程序检索视图模型的过程。

这应该是正确的答案。Depechie的回答是反模式。 - IamDOM
你缺少了一个开括号 ( 在 App.Current 前面。 - IamDOM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接