【问题标题】:Static ViewModels vs instanced ViewModels静态视图模型与实例视图模型
【发布时间】:2011-08-24 20:16:38
【问题描述】:

我有两个视图共享来自某个视图模型的一个可观察集合,但具有不同的集合视图参数。在 MVVM Light 中实现它的正确方法是什么?是否支持非静态 VM?我该如何管理它们的生命周期并处理它们?

【问题讨论】:

  • 您使用的是 DI 容器,例如 Unity 或 MEF?
  • 不,我使用基本的 MVVM Light 模板。

标签: c# wpf mvvm viewmodel mvvm-light


【解决方案1】:

一些 Laurent 的 examples of MVVM Light 使用带有静态 ViewModel 实例(类似单例)的 ViewModelLocator。注意ICleanup 接口。此外,非静态 VM 通常必须在 View 的构造函数中插入或构造。

【讨论】:

    【解决方案2】:

    对于 ViewModels 管理通常使用 IOC 模式。在 MVVM Light 框架中,它是一个 SimpleIoc 实现。

    我更喜欢使用 Ninject - http://www.ninject.org/

    【讨论】:

      【解决方案3】:

      有!

      默认情况下,从 SimpleIoc 解析的对象是单例。要解决此问题,您需要将唯一标识符作为 ServiceLocator.GetInstance 方法的参数传递。

      见下文:

      我们有两个属性返回相同的视图模型。一个返回一个单例,另一个每次都会返回一个新实例。

      class ViewModelLocator
      {
          static ViewModelLocator()
          {
              ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
              if (ViewModelBase.IsInDesignModeStatic)
              {
                  SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
              }
              else
              {
                  SimpleIoc.Default.Register<IDataService, DataService>();
              }
      
              SimpleIoc.Default.Register<MainViewModel>();
              SimpleIoc.Default.Register<SecondViewModel>();
          }
      
      
          public MainViewModel MainAsSingleton
          {
              get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
          }
      
          public MainViewModel MainAsDiffrentInstanceEachTime
          {
              get { return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString()); }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 2011-07-04
        • 2020-06-20
        • 2023-03-06
        • 1970-01-01
        • 2020-01-26
        相关资源
        最近更新 更多