2013-09-24 70 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,卸載視圖時不必處理它...因爲您有一個對它的引用,您可以根據任意觸發器(即使在卸載視圖後)選擇丟棄它(如果有的話)字典中視圖模型的「關鍵」。 –