2013-09-24 26 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(); 
    } 
} 

アプリケーションクラスは、MainViewModelを静的メンバとして含み、アプリケーションがアクティブになると、ViewModelがロードされます。

ケースであること、私は次の質問持っていること:私のアプリはいくつかのviewmodelsを持っている場合

  1. 、それらのすべてがApp.xaml.csファイル内のメンバーとして保存されますか?

  2. すべてのViewModelのデータが同時に読み込まれる場合、アプリのメモリを管理するにはどうすればよいですか?各ViewModelのデータをアンロードし、Viewで使用されているViewModelだけをロードすることはできますか?

答えて

9

ViewModelをインスタンス化する方法はさまざまです。それらのいくつかは、起動時にすべてをインスタンス化しますが、他のインスタンスはViewModelが必要になるまでインスタンス化しません。次のブログ記事で

あなたはViewModelにインスタンス化するために、いくつかの可能なアプローチがあります:あなたの質問に答える

MVVM Instantiation Approaches

を。あなたのアプローチに従えば、すべてのViewModelのメンバーをApp.xaml.csファイルに定義する必要があります。 ViewModelが必要になるまでインスタンス化しないアプローチに従うことができます。

MVVMパターンの実装が容易なMVVM LightまたはCaliburn Microなどのツールキットがいくつかあります。私は個人的にLocatorアプローチを使用するMVVM Light Toolkitを使用しています。このツールキットを使用して、ViewModelはデフォルトで必要に応じてロードされますが、起動時に特定のViewModelをロードするように設定することができます。これはいくつかのシナリオで便利です。

+0

偉大な答え、ありがとう!また、リファレンスも素晴らしいです:) このアプローチを使用すると、使用していないときにあまりにも多くのメモリを占有したくない場合、私のViewModelsからデータをアンロードする最も良い方法は何でしょうか。 ? – miguelarcilla

+0

私はあなたのViewModelにIDisposableを実装し、Viewを離れるときにそれを廃棄するオプションがあると思います。 – anderZubi

+0

andersZubiの答えを展開すると、私はアプリの現在の状態を表すシングルトンを作成し、Dictionary 型のプロパティを持っています。ビューモデルを必要とするすべてのページまたはコントロールは、まず辞書を検索し、それがまだ存在しない場合は作成し、辞書にviewModelを追加します。次にIDisposableの場合は、ビューをアンロードするときにそのビューを破棄する必要はありません。ビューがアンロードされた後でも、任意のトリガーに基づいてそのビューを破棄することを選択できます。辞書のビューモデルの「キー」 –

関連する問題