C# Windows Phone 8-MVVM ViewModels和App.xaml.cs

C# Windows Phone 8-MVVM ViewModels和App.xaml.cs,c#,mvvm,windows-phone-8,viewmodel,C#,Mvvm,Windows Phone 8,Viewmodel,我一直在研究MVVM模式,并将其应用于Windows Phone 8应用程序中,我有一个关于在应用程序中初始化和访问ViewModels的最佳实践的问题 当我从WP8 SDK模板创建数据绑定应用程序时,我注意到App.xaml.cs文件中有以下代码: public static MainViewModel ViewModel { get { // Delay creation of the view model until necessary if

我一直在研究MVVM模式,并将其应用于Windows Phone 8应用程序中,我有一个关于在应用程序中初始化和访问ViewModels的最佳实践的问题

当我从WP8 SDK模板创建数据绑定应用程序时,我注意到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被加载

在这种情况下,我有以下问题:

  • 如果我的应用程序有多个ViewModels,它们是否都会作为成员存储在App.xaml.cs文件中

  • 如果同时加载每个ViewModel的数据,如何管理应用程序的内存?是否可以卸载每个ViewModel的数据并仅加载我的视图正在使用的ViewModel


  • 实例化ViewModels有许多不同的方法。其中一些将在启动时实例化所有视图,而另一些则在需要时才实例化ViewModel

    在以下博客文章中,您将发现一些实例化ViewModel的可能方法:

    回答你的问题;1.-按照您的方法,您必须在App.xaml.cs文件中为所有ViewModels定义成员。2.-您可以采用在需要之前不实例化ViewModel的方法


    有一些工具包,比如or,可以简化MVVM模式的实现。我个人使用,它使用定位器方法。使用此工具包,默认情况下,ViewModels会在需要时加载,但您可以将其设置为在启动时加载特定的ViewModel,这在某些情况下非常有用。

    回答得很好,非常感谢!参考资料也很好:)只是想知道,如果我采用这种方法,如果我不想让ViewModels在不使用时占用太多内存,那么从ViewModels中卸载数据的最佳方法是什么?我认为一种选择是在ViewModel中实现IDisposable,并在离开视图时进行处理。展开andersZubi的回答,我想创建一个代表应用程序当前状态的单例,并且具有Dictionary类型的属性。每个需要视图模型的页面或控件,首先查找字典,然后在它还不存在时创建它,并将视图模型添加到字典中。然后,如果它是IDisposable,您不必在卸载视图时处理它。。。因为您有一个对它的引用,所以如果字典中有视图模型的“键”,您可以选择基于任意触发器(即使在卸载视图之后)来处理它。