gpt4 book ai didi

c# - MVVMLight ViewModelLocator 创建新的 ViewModel

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:14 24 4
gpt4 key购买 nike

我一直在按照mvvmlight 编写一个项目。我有 3 个 xaml 文件 MainWindow, View1, View2,

我已经在我的 ViewModelLocator 中注册了所有三个 View 模型,以及 View1Model 使用的数据服务

    public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IView1Service, View1Service>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<View1Model>();
SimpleIoc.Default.Register<View2Model>();
}

public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
}
}
public View1Model View1
{
get
{
return ServiceLocator.Current.GetInstance<View1Model >(Guid.NewGuid().ToString());
}
}
public View1Model View2
{
get
{
return ServiceLocator.Current.GetInstance<View2Model >(Guid.NewGuid().ToString());
}
}

View1Model 需要一个 IView1Service 作为构造函数输入,

   public View1Model(IView1Service view1Service)
{
_view1_service = view1Service;
}

在我的 App.xaml 中,我将它们注册如下

<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:View1Model}">
<views:view1 />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:View2Model}">
<views:View2 />
</DataTemplate>
</Application.Resources>

当然 View1 View2MyProject.View 命名空间下的 xmal 文件。

我试图初始化我的 MainViewModel 中的所有 View ,因此我访问了 MainViewModel 中的所有 View 模型实例

    public MainViewModel()
{
// Add available pages
PageViewModels.Add(new View1Model(new View1Service())); // <========How to get this from the ViewModelLocator ?
PageViewModels.Add(new View1Model());

// Set starting page
CurrentPageViewModel = PageViewModels[0];

}

PageViewModels.Add(new View1Model()); 在这行代码中,我希望从 ViewModelLocator 获取它而不是传递 View1Service 对象。但是我在 App.xaml 中注册的 Locator 在这里无法访问,解决这个问题的最佳方法是什么?

最佳答案

我使用 MVVMLight 开发通用应用程序,而不是 WPF。不过我想应该差不多吧。

您不必显式创建 ViewModel 的新实例。它是一个单例,所以当 ServiceLocator.Current.GetInstance<T>() 时会创建一个实例最先被调用。

此外,SimpleIoc 足够聪明,可以在需要参数时找到合适的类(匹配之前注册的类型,在本例中为 IView1Service)进行实例化。

Locator您在 App.xaml 中注册的在其他 xaml 中使用,例如:

<Page
...
DataContext="{Binding View1, Source={StaticResource Locator}}"
>

在代码中获取 ViewModel 实例,就像@goobering 的回答一样。

View1Model vm = (new ViewModelLocator()).View1;

创建多个 ViewModelLocator 实例是安全的,并且返回的 ViewModel 是同一个对象。

关于c# - MVVMLight ViewModelLocator 创建新的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29936090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com