MVVMLight ViewModelLocator 创建新的 ViewModel

MVVMLight ViewModelLocator to create new ViewModel

我一直在跟着mvvmlight编码一个项目。我有 3 xaml 个文件 MainWindowView1View2

我已经在我的 ViewModelLocator 中注册了所有三个视图模型,以及 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 中的所有视图,所以我访问了 MainViewModel

中的所有视图模型实例
    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 在这里无法访问,解决这个问题的最佳方法是什么?

我通过在我的 ViewModel 中创建 ViewModelLocator 作为私有字段来做到这一点

public class MyViewModel : ViewModelBase
{
    private ViewModelLocator _locator;

    public MyViewModel()
    {
        _locator = new ViewModelLocator();
    }
}

然后您可以通过 ViewModelLocator 使用以下方法访问您的 ViewModel:_locator.View1_locator.View2

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

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

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

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

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

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

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

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