MVVM中的ViewModelLocator是否为每个ViewModel保存内存中的实例?

时间:2017-08-25 08:27:41

标签: c# mvvm mvvm-light

我在一个非常大的软件上工作,有超过100个对话框。我们正在考虑使用MVVM光,但我只是阅读了一个古老的artikle,其中指出"所有ViewModel都保留在内存中,直到调用cleaup"。 所以我的问题:

  • 这是否意味着在加载时它会在程序中加载所有 ViewModels?
  • 如果是默认加载全部,我可以将其更改为仅在打开对话框时加载/实例化ViewModels吗?

文章是Abkürzung zum ViewModel。对不起,但是从2008年开始,用德语,你需要注册阅读。但我的问题只是关于那个陈述,所以你可以忽略它。

我看过this question,信息非常丰富,但我没有真正找到问题的答案。

1 个答案:

答案 0 :(得分:1)

这是由 nugetting ViewModelLocator包创建的默认mvvmlight类。

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        ////if (ViewModelBase.IsInDesignModeStatic)
        ////{
        ////    // Create design time view services and models
        ////    SimpleIoc.Default.Register<IDataService, DesignDataService>();
        ////}
        ////else
        ////{
        ////    // Create run time view services and models
        ////    SimpleIoc.Default.Register<IDataService, DataService>();
        ////}

        SimpleIoc.Default.Register<MainViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

除非将它放在那里,否则没有魔法在该类中创建任何视图模型。默认情况下会涉及ServiceLocator,您可以删除并替换您选择的任何DI容器,也可以手动执行此ViewModelLocator处理的ViewModel实例化。

默认情况下,static Cleanup() 未被调用,您必须随时拨打电话,以便随时拨打电话。如果需要的话,这完全取决于你。

结论ViewModelLocator将如何运作和行为取决于您

回答你的问题:

  
      
  • 这是否意味着在加载时它会在程序中加载所有 ViewModels?
  •   

不,除非你编写代码才会这样做

  
      
  • 如果是默认加载全部,我可以将其更改为仅在打开对话框时加载/实例化ViewModels吗?
  •   

(见上文)