【问题标题】:MVVMLight ViewModelLocator to create new ViewModelMVVMLight ViewModelLocator 创建新的 ViewModel
【发布时间】:2015-07-08 06:54:27
【问题描述】:

我一直在关注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 View2xmal 文件在MyProject.View 命名空间下。

我试图初始化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 在这里无法访问,解决此问题的最佳方法是什么?

【问题讨论】:

    标签: c# wpf xaml mvvm mvvm-light


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      public class MyViewModel : ViewModelBase
      {
          private ViewModelLocator _locator;
      
          public MyViewModel()
          {
              _locator = new ViewModelLocator();
          }
      }
      

      然后您可以通过 ViewModelLocator 访问您的 ViewModel,使用:_locator.View1_locator.View2 等。

      【讨论】:

      • 它似乎正在工作,但是,我确实有一个后续问题,我在App.xaml 中声明的Locator 与这个私人成员_locator 的关系是什么。在MainWindow.xaml 中,我声明了DataContext="{Binding Main, Source={StaticResource Locator}}",那么在这种情况下MainWindow.xamlDataContext 是什么?
      • 它们是一样的。 ViewModelLocator 是一个单例 - 在“正常”条件下,只有 1 个 ViewModelLocator,它返回相同的 ViewModel 实例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多