2011-05-05 5 views
1

WPF를 model-view-viewmodel 패턴과 함께 사용하고 있습니다. 나는 페이징 설정의 일종 내 기본 창에서새로운 viewmodel을 만들 때마다 뷰 생성자가 호출되지 않는 이유는 무엇입니까?

  <DataTemplate DataType="{x:Type VM:ResultsViewModel}"> 
       <VW:ResultsView/> 
      </DataTemplate> 

곳 MainContent 속성에는 현재 페이지 (뷰 모델 인스턴스) :이처럼 연결되어 ResultsView 및 ResultsViewModel 있습니다.

내가이

MainContent = new ResultsViewModel(); 

ResultsView 같은 페이지를 작성하는 것은 UserControl을 기반으로, 그것은 또한 일부 UI 초기화 물건을 수행로드 이벤트에 대한 핸들러를 가지고있다.

사용자가 다른 페이지를 탐색하는 동안 모든 것이 잘 작동합니다.

그러나 사용자가 ResultsView를 두 번 연속 열면 ResultsView 생성자는 이 아니며 두 번째로 호출되고은로드 된 이벤트가 호출되지 않습니다. 이제 새로운 ResultsViewModel()에 연결된 동일한 이전 ResultsView 인스턴스가있는 것 같습니다!

새로운 ViewModel을 만들 때마다 WPF가 새로운보기를 생성하지 않는 이유는 무엇입니까? 이전 뷰 모델이 파괴되면 WPF가 이전 뷰를 무시하도록 강제 할 수있는 방법이 있습니까?

답변

8
<DataTemplate x:Shared="False" DataType="{x:Type VM:ResultsViewModel}"> 
    <VW:ResultsView/> 
</DataTemplate> 
+0

쿨, x : Shared 수정 자에 대해 몰랐습니다. –

+0

그것에 대한 의견이 있으십니까? – MDDDC

+0

공유가 false로 설정되지 않으면 DataTemplate이 'ResultsView'인스턴스를로드합니다. 즉, 'ResultsView'의 생성자가 호출되지 않습니다. – jHilscher

2

실제 문제 해결을위한 Kent의 대답을 참조하십시오.

즉, 시각적 트리를 구성하고 모든 바인딩을 설정하는 데 따른 오버 헤드가 있으므로보기를 한 번만 인스턴스화하는 것이 좋습니다. 일반적으로 View/ViewModel은 뷰없이 배후의 ViewModel을 바꿀 수 있도록 설계되어야합니다 (DataContext가 변경되지 않고 모든 바인딩 값이 재평가되는 것을 제외하고). Loaded 이벤트에 현재 로직이 있다면 특정 ViewModel을 준비하고 대신 DataContext가 변경 될 때 알림을 등록하는 것을 고려하십시오 (this example 참조).

+0

아이디어를 제공해 주셔서 감사 드리며 다음 신청서를 디자인 할 때 제안 된 방법을 사용하겠습니다. – JustAMartin

관련 문제