我正在尝试使用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片段对不同的视图模型有一个静态方法。但那些不再存在,所以我认为这不是要走的路。但是什么呢?或者,如果我想从视图模型访问定位器,我是否完全违背了模式?
答案 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的过程。