从代码中访问MVVM Light ViewModelLocator

Muh*_*Kuh 2 .net c# wpf mvvm-light

我正在尝试使用MVVM Light Toolkit实现一个应用程序,但我不知何故坚持使用ViewModelLocator.

虽然我很清楚如何从XAML中的视图和视图的代码隐藏中访问它,但是从其他视图模型访问它时遇到了一些问题.

在App.xaml中:

<Application.Resources>
  <vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:MvvmLight1.ViewModel" x:Key="Locator" />
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

在视图中:

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
Run Code Online (Sandbox Code Playgroud)

但是如何从其他视图模型中访问例如MainViewModel?似乎以前版本的ViewModelLocator片段对不同的视图模型有一个静态方法.但那些不再存在,所以我认为这不是要走的路.但是什么呢?或者如果我想从视图模型访问定位器,我是否完全违背了模式?

Dep*_*hie 10

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

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

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

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

并得到它 ServiceLocator.Current.GetInstance<MainViewModel>();

  • 接受答案的psst会很好:) (6认同)
  • 是的,这种代码在ViewModelLocator中.所以你的建议是直接使用SimpleIoc而不是ViewModelLocator类? (2认同)
  • 是的,因为这就是为什么你在第一个地方添加了Ioc :)用于'注入'所以在任何其他类中使用这些类实例. (2认同)