2013-09-24 110 views
8

我一直在研究MVVM模式,并将其付诸实施在Windows Phone 8应用程序中,并且我有一个关于初始化和访问ViewModels的最佳实践的问题应用程序。Windows Phone 8 - MVVM ViewModels和App.xaml.cs

当我从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被加载。

既然如此,我有以下问题:

  1. 如果我的应用程序有几个的ViewModels,将所有的人都将被存储为App.xaml.cs文件中的成员?

  2. 如果每个ViewModel的数据都在同一时间加载,我该如何管理我的应用程序的内存?是否有可能卸载每个ViewModel的数据,只加载我的View正在使用的ViewModel?

回答

9

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

在下面的博客文章,你会发现一些可能的方法来实例化一个视图模型:

MVVM Instantiation Approaches

回答你的问题; 1.-遵循您的方法,您必须在您的App.xaml.cs文件中为所有ViewModel定义成员。 2.-你可以按照一种方法,在需要的时候不会实例化ViewModel。

存在一些工具包,例如MVVM LightCaliburn Micro,它们可以轻松实现MVVM模式。我个人使用MVVM Light Toolkit,它使用定位器的方法。使用这个工具包,默认情况下会在需要时加载ViewModels,但您可以将其设置为在启动时加载特定的ViewModel,这在某些情况下很有用。

+0

很好的答案,非常感谢!并且引用也很好:) 想知道,如果我要采用这种方法,如果我不希望它们在不使用时占用太多内存,从ViewModels中卸载数据的最佳方法是什么? – miguelarcilla

+0

我认为一种选择是在ViewModel中实现IDisposable并在离开视图时处理它。 – anderZubi

+0

展开andersZubi的答案,我喜欢创建一个表示应用程序当前状态的单例,并且具有Dictionary 类型的属性。每个需要视图模型的页面或控件,首先在字典中查找,然后在它不存在的情况下创建它,然后将viewModel添加到Dictionary中。然后,如果它是IDisposable,卸载视图时不必处理它...因为您有一个对它的引用,您可以根据任意触发器(即使在卸载视图后)选择丢弃它(如果有的话)字典中视图模型的“关键”。 –