从代码访问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片段似乎对不同的视图模型有一个静态方法。但这些已经不存在了,所以我认为这不是应该走的路。但什么是?或者,如果我想从视图模型访问定位器,我是在做完全违背模式的事情吗?
这在一定程度上取决于您如何设置视图模型定位器,但通常您应该使用IOC容器来注册所有不同的ViewModel。
例如,当使用MVVM Light时,它会是这样的:SimpleIoc.Default.Register<MainViewModel>();
因此,当它可用时,您可以在任何其他类中使用它,也可以在另一个视图模型中使用:SimpleIoc.Default.GetInstance<MainViewModel>();
或者,如果你告诉ServiceLocator你正在使用SimpleIoc,它会是这样的:(注册)ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
然后把它拿回来ServiceLocator.Current.GetInstance<MainViewModel>();
然而,我将提出另一种方法,该方法将以与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的过程。