2012-01-16 3 views
0

MVVM 패턴을 준수하는 WP7 애플리케이션을 프로그래밍 중입니다.탐색 할 때 인스턴스 생성을 관리하는 방법

저는 ViewModel의 각 인스턴스가 하나 뿐인 ViewModelLocator를가집니다. 이러한 ViewModel은 응용 프로그램이 시작될 때 만들어집니다. 메시지를 사용하여 서로 통신하는 ViewModels. 다음 페이지로 navigatig에 대한 메시지를 사용합니다. NavigationService.Navigate()를 사용하고 있는데 이는 MainPage CodeBehind에서 발생합니다. CodeBehind에있는 유일한 기능입니다. ViewModel은 페이지의 DataContext를 ViewModelLocator로 설정하여 함께 연결됩니다.

Everythig는 첫눈에 작동합니다.

그러나 각 탐색 중에는 ViewModelLocator (ViewModelLocator 용으로 설계된)에서 ViewModel에 연결된 새 Page 인스턴스가 만들어집니다. 결과는 다음과 같습니다. 사용자가 종종 페이지를 전환 할 때 페이지의 여러 인스턴스가 하나의 ViewModel에 연결됩니다. 물론, 한 번에 한 페이지 만 볼 수 있습니다.

매우 간단한 해결책은 NavigationCache를 설정할 수 있지만 WP7에서는 읽기 전용입니다.

원하지 않는 동작의 해결책을 찾고 있습니다.

+0

페이지 언로드 기능에서 DataContext를 Null로 설정하면 GC가 페이지를 더 빨리 수집합니다. – BigL

답변

0

어딘가에서 탐색 할 때마다 해당 페이지에 대해 새 인스턴스가 만들어집니다. NavigationService.GoBack()을 사용하여이 문제를 방지 할 수 있습니다. 이제까지 할 수있는 곳.

가비지 수집기가 해당 페이지를 지울 수 있도록 페이지에서 벗어날 때 모든 이벤트에서 등록 취소해야합니다.

이 정보가 도움이되기를 바랍니다.

0
당신은 같은 App.xaml.cs를에서 당신의 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.ViewModel로 참조 할 수 있습니다. 페이지가 기본 응용 프로그램을 형성하는 다른 어셈블리에있는 경우

, 당신은

다음과 같은 주요 애플리케이션에 VM의 참조가, 당신이 사용할 수있는

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

은, 당신의 App.xaml에 다음과 같은 선언 할 수

((ViewModelLocator)Application.Current.Resources["VMLocator"]).YourViewModel; 

희망이 있으면 도움이 될 것입니다.

관련 문제