현재 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>(); }
}
이것은 의도적으로 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
[이] (http://stackoverflow.com/questions/9794151/stop-tabcontrol-from-recreating-its-children)을 시도해 볼 수 있지만 대신 ContentControl을 확장하십시오. – Michael
그 제안에 감사드립니다. 나는이 방법을 사용할 것이다. – kotsumu