2014-04-15 7 views
2

새로운보기를 매번 생성하지 마십시오.나는 이런 식으로 뭔가를 DataTemplate을/데이터 형식

그러나 tabcontrol과 많은 하위 뷰가있는보기가 하나 있습니다. 각 하위 뷰에는 사용자 지정 XML 파일 (복잡한 비즈니스 사례)로 구성된 여러 시각적 부분이 있습니다. 이 뷰가 생성 될 때마다 작은 (1-2 초) 지연을 유발하는 xml 파일이 파싱됩니다. 짜증나게하고 UI가 느려지 게하는 데는 지연이 충분합니다.

ViewModel이 바인딩 될 때마다보기를 파괴하고 다시 만들지 않고 DataTemplate 패턴을 사용하는 방법이 있습니까? 가능한 경우 뷰 모델을 변경하지 않을 것입니다.

+0

귀하의 질문에 많은 정보가 부족합니다. 매번 XML 파일을 구문 분석하는 이유는 무엇입니까? XML 파일 데이터가 작성중인보기에 미치는 영향 적어도 단순화 된 시나리오를 줄 수 있습니까? – Dmitry

+0

그 질문에 대답하는 데 필요한 것은 없습니다. 뷰 또는 뷰 모델을 재구성하고 싶지 않습니다. viewmodel이 바인딩 될 때마다 뷰를 손상시키지 않고 DataTemplates를 사용하는 방법이 있는지 묻는 것입니다. – ConditionRacer

답변

2

이 경우 가장 쉬운 해결책은 항상 두 개의보기가 있고 어느 것이 표시되는지 변경하는 것입니다. 당신은 유형이 보이는 반환하는 매개 변수와 일치하거나 축소 있는지 확인합니다 데이터 컨텍스트

<View1 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM1}" /> 
<View2 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM2}" /> 

그리고 컨버터의 유형에 따라 가시성을 변경하는 변환기를 사용할 수 있습니다.

+1

이 메서드는 바인딩이 많은 복잡한 뷰의 성능 문제를 일으킬 수 있습니다. 실제로 뷰가 보이고 시각적 트리가 생성되면 바인딩은 접힌 상태에서도 새로 고쳐집니다. – Dmitry

0

추가 클래스로 VM을 래핑 할 수 있습니다. DataTemplates는 Wrapper 클래스의 유형을 결정하지만 실제 구현은이 Wrapper의 속성을 통해 노출 자입니다. 이 속성을 변경하면 DataTemplate은 다시로드되지 않지만 모든 바인딩은 새로 고쳐집니다.

래퍼 클래스 :

public class WrapperVM1:INotifyPropertyChanged 
{ 
    public Content VM1 { get{...} set{...} } 
} 

public class WrapperVM2:INotifyPropertyChanged 
{ 
    public Content VM2 { get{...} set{...} } 
} 

지금 데이터 템플릿을 설명합니다 래퍼 클래스 표현 :

<DataTemplate DataType="{x:Type local:WrapperVM1}"> 
    <TextBlock Text={Binding Content.SomPropertyInVM1}"/> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:WrapperVM2}"> 
    <TextBlock Text={Binding Content.SomPropertyInVM2}"/> 
</DataTemplate> 

당신이 VM의 새로운 인스턴스 래퍼의 Content 속성을 대체 할 경우 당신이 볼 수 있듯이 뷰를 다시 생성하지는 않지만 모든 바인딩이 업데이트됩니다. 그러나 다른 유형의 VM으로 전환해야하는 경우 Wrapper 클래스를 적절한 래퍼로 대체해야합니다.

관련 문제