从代码中访问MVVM Light ViewModelLocator

时间:2015-11-03 16:56:38

标签: c# .net wpf mvvm-light

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

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

在App.xaml中:

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

在视图中:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !(abcdefg) index.php
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

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

2 个答案:

答案 0 :(得分:10)

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

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

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

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

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

答案 1 :(得分:2)

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和Code是等效的。我希望这可以帮助您解决应用程序检索ViewModel的过程。