Windows Phone 8 - MVVM视图模型和App.xaml.cs

7
我一直在研究MVVM模式,并在Windows Phone 8应用程序中实践它,我有一个关于在应用程序中初始化和访问ViewModels的最佳实践问题。
当我从WP8 SDK模板中创建一个Databound Application时,我注意到在App.xaml.cs文件中有这段代码:
public static MainViewModel ViewModel
{
    get
    {
        // Delay creation of the view model until necessary
        if (viewModel == null)
            viewModel = new MainViewModel();

            return viewModel;
    }
}

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    // Ensure that application state is restored appropriately
    if (!App.ViewModel.IsDataLoaded)
    {
        App.ViewModel.LoadData();
    }
}

据我了解,这意味着App类将MainViewModel作为静态成员进行存储,并且当应用程序被激活时,ViewModel将被加载。
在这种情况下,我有以下问题:
  1. 如果我的应用程序有多个ViewModel,它们是否都会作为成员存储在App.xaml.cs 文件中?

  2. 如果每个ViewModel的数据同时加载,我该如何管理我的应用程序内存?是否有可能卸载每个ViewModel的数据并仅加载由我的View使用的ViewModel?

1个回答

8
有许多不同的方法来实例化ViewModels。其中一些将在启动时全部实例化,而其他一些则直到需要时才实例化ViewModel。
在以下博客文章中,您将找到一些可能的实例化ViewModel的方法: MVVM实例化方法 回答您的问题:1.-按照您的方法,您将不得不在App.xaml.cs文件中为所有ViewModel定义成员。2.-您可以遵循一种不实例化ViewModel直到需要时才实例化的方法。
存在一些工具包,如MVVM LightCaliburn Micro,可简化MVVM模式的实现。我个人使用MVVM Light Toolkit,它使用定位器方法。使用此工具包,默认情况下仅在需要时加载ViewModels,但您可以将其设置为在启动时加载特定的ViewModel,这在某些情况下非常有用。

非常好的答案,非常感谢!参考资料也很棒 :)我只是想知道,如果我采用这种方法,如果我不想让它们在不使用时占用太多内存,从我的ViewModels中卸载数据的最佳方法是什么? - miguelarcilla
我认为一个选项是在你的ViewModel中实现IDisposable接口,并在离开View时进行Dispose。 - anderZubi
扩展andersZubi的答案,我喜欢创建一个代表应用程序当前状态的单例,并具有类型为Dictionary<string,IViewModel>的属性。每个需要视图模型的页面或控件首先查找字典,然后在不存在时创建它,并将viewModel添加到字典中。然后,如果它是IDisposable,则在卸载视图时不必处理它...因为您有对它的引用,可以根据任意触发器(甚至在视图卸载后)选择处理它,如果您在字典中拥有视图模型的“键”。 - Zack Weiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接