2012-01-16 6 views
0

MVVMパターンを遵守しているWP7アプリケーションをプログラミングしています。ナビゲート時にインスタンスの作成を管理する方法

私は、ViewModelの各インスタンスが1つだけであることを保証するViewModelLocatorを持っています。これらのViewModelは、アプリケーションの起動時に作成されます。 ViewModelsはメッセージを使用して互いに通信します。私は次のページにナビゲートするためにメッセージを使用します(NavigationService.Navigate()を使用しています。これはMainPage CodeBehindから発生します)。CodeBehindにある唯一の機能です。 ViewModelは、ViewModelLocatorにページ内のDataContextを設定することによって一緒に接続されます。

Everythigは一目ぼれです。

しかし、各ナビゲーション中にViewModelLocator(ViewModelLocator)からViewModelに接続された新しいPageインスタンスが作成されます。その結果、ユーザーがページを頻繁に切り替えると、1つのViewModelに複数のページインスタンスが接続されます。もちろん、1つのページには1つのページしか表示されません。

非常に単純な解決策はNavigationCacheを設定することができますが、WP7では読み込み専用です。

私は望ましくない動作の解決策を探しています。

+0

ページのアンロード機能で、DataContextをNullに設定しようとすると、GCがページをより迅速に収集します。 – BigL

答えて

0

どこかでナビゲートするたびに、そのページの新しいインスタンスが作成されます。 これを回避するには、NavigationService.GoBack()を使用します。これまでどこでも可能です。

ガベージコレクタがそのページをクリアできるように、ページからナビゲートするときは、すべてのイベントの登録を解除する必要があります。

こちらがお役に立てば幸いです。

0

あなたは、あなたがApp.ViewModelとしてそれを参照することができますに移動しますページから次に、このような

private static YourViewModel viewModel = null; 
public static YourViewModel ViewModel 
{ 
    get 
    { 
     // Delay creation of the view model until necessary 
     if (viewModel == null) 
      viewModel = ViewModelLocator.MainStatic; 

     return viewModel; 
    } 
} 

、として、App.xaml.csであなたのViewModelのインスタンスを宣言しようとするかもしれません。

あなたのページには、別のアセンブリ内にある場合は、あなたのメインアプリに参照するVMは、その後、あなたが使用することができます

<vm:ViewModelLocator x:Key="VMLocator" /> 

、あなたはApp.xamlで、次の宣言ができ、メインアプリケーションを形成

、以下の通りであります
((ViewModelLocator)Application.Current.Resources["VMLocator"]).YourViewModel; 

希望すると助かります。

関連する問題