2016-07-19 3 views
1

현재 ViewModel에 따라 두 개의 DataTemplate이 전환됩니다. 그러나 내가 ViewModel을 전환 할 때마다 해당 View의 생성자를 호출하고 생성자 내에서 InitializeComponent() 호출을 호출하여 DataTemplate을 전환 할 때마다 이 호출 될 때마다 해당 DataTemplate에 바인딩 된 새보기가 생성됩니다. 왜 이런 일이 일어나고 있는지 모르겠지만 ViewModels를 전환 할 때 새로운 View의 생성을 막을 수있는 방법이 있습니까?MVVM - datatemplate가 새 뷰를 만듭니다.

다음은 내 MainView에있는 DataTemplates입니다.

<Window.Resources> 
    <DataTemplate DataType="{x:Type viewModels:FirstPanelViewModel}"> 
     <views:FirstPanelView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type viewModels:SecondPanelViewModel}"> 
     <views:SecondPanelView /> 
    </DataTemplate> 
</Window.Resources> 

템플릿이 ContentControl에 표시되고 있습니다.

이것은 내 FirstPanelView와 동일한 제 2PanelView입니다. 매우 간단합니다.

public partial class FirstPanelView 
{ 
    public FirstPanelView() 
    { 
     InitializeComponent(); 
    } 
} 
public partial class SecondPanelView 
{ 
    public SecondPanelView() 
    { 
     InitializeComponent(); 
    } 
} 

내 IOC의 내가 정의 태그 확장하여 각 뷰에서 경계중인 SecondPanelView

container.Register<IFirstPanelViewModel, FirstPanelViewModel>(new PerContainerLifetime()) 
container.Register<ISecondPanelViewModel, SecondPanelViewModel>(new PerContainerLifetime()); 

의 DataContext의 인스턴스를 생성 있는지 확인합니다.

DataContext="{Binding Source={common:Locate}, Path=FirstPanelViewModel}" 
DataContext="{Binding Source={common:Locate}, Path=SecondPanelViewModel}" 

각 ViewModel의 GetInstance를 호출하는 중입니다.

public IFirstViewModel FirstViewModel 
{ 
    get { return _container.GetInstance<IFirstPanelViewModel>(); } 
} 
public ISecondViewModel SecondViewModel 
{ 
    get { return _container.GetInstance<ISecondPanelViewModel>(); } 
} 
+3

이것은 의도적으로 WPF에서입니다. 뷰가 범위를 벗어나면 뷰가 삭제되고 다시 표시해야하는 경우 다시 만들어야합니다. ViewModel의 첫 번째 접근 방식 인 a.k.a. DataTemplates를 사용하는 경우 발생합니다. 바인드 된 소스 항목과 데이터 템플릿이있는 TabControl을 사용하는 경우에도 동일한 작업이 수행됩니다. ViewModel이 다시 작성되지 않더라도 뷰는 다음과 같습니다. 이 문제를 해결할 수있는 유일한 방법은보기 작성 방법을 제어 할 수있는 방법입니다. 이 작업은 사용자 지정 컨트롤에서 수행 할 수 있습니다. [여기] (http://stackoverflow.com/questions/3877611/is-it-possible-to-cache-the-view-when-using-model-first-approach)를 참조하십시오. – Michael

+0

[이] (http://stackoverflow.com/questions/9794151/stop-tabcontrol-from-recreating-its-children)을 시도해 볼 수 있지만 대신 ContentControl을 확장하십시오. – Michael

+0

그 제안에 감사드립니다. 나는이 방법을 사용할 것이다. – kotsumu

답변

0

ContentControl을 확장 한 후에도 문제를 해결할 수 없었습니다. 이 접근 방식을 사용하여 겪었던 문제는 ContentControl의 종속성 속성이 기존의 종속성 속성을 해킹하도록 직접 인터페이스 할 수 없거나 무시할 수 없다는 것입니다. 또한 DataTemplate의 초기 화는 단순한 ContentControl보다 더 심화 된 것 같습니다.

그래서 내 시야가 단순히 가시성을 전환하여 표시되는 방식을 변경하기로 결정했습니다. 이 접근 방식은 본질적으로 내 견해가 자신의 일을하는 백그라운드에서 머물러 있고 언제든지 이전 상태로 연결할 준비가되기를 원하기 때문에 나에게 도움이되었습니다.

1

이 문제는 오래된 문제이지만이 문제로 인해 어려움을 겪고 있습니다. 대답은 뷰 인스턴스를 리소스에 직접 배치하고 데이터 템플릿의 컨텐트 컨트롤에 바인딩하는 것입니다. 그렇게하면 뷰는 한 번만 인스턴스화됩니다.

<Window.Resources> 
    <views:FirstPanelView x:Key="FirstPanelViewKey"/> 
    <views:SecondPanelView x:Key="SecondPanelViewKey"/> 
    <DataTemplate x:Key="DT1"> 
     <ContentControl Content="{StaticResource FirstPanelViewKey}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="DT2"> 
     <ContentControl Content="{StaticResource SecondPanelViewKey}" /> 
    </DataTemplate> 
</Window.Resources> 
관련 문제