我使用的是一个非常大的软件,其中包含超过100个对话框。我们正在考虑MVVM,但是我只是读了一个老文章,指出“在调用Cleaup之前,所有ViewModel都保留在内存中”。
所以我的问题是:

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


  • 该文章是Abkürzung zum ViewModel。抱歉,这是2008年的德语版本,您需要注册才能阅读。但是我的问题只是关于该陈述,因此您可以忽略它。

    我读过this question,它提供的信息非常丰富,但是我并没有真正找到问题的答案。

    最佳答案

    这是通过拼合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
        }
    }
    

    除非放在其中,否则在该类内创建任何 View 模型是没有魔术的。默认情况下,包含一个ServiceLocator,您可以将其删除并替换为您选择的任何DI容器,或者手动实例化此ViewModelLocator处理的ViewModel。

    默认情况下,static Cleanup()而不是,您必须将调用放置在任何需要的地方,以便随时随地调用它。如果根本需要,那完全取决于您。

    结论:取决于ViewModelLocator如何操作和表现

    要回答您的问题:



    不,除非您编写将这样做的代码



    (看上面)

    关于c# - MVVM中的ViewModelLocator是否为每个ViewModel在内存中保存实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45877297/

    10-16 10:03