2010-07-02 3 views
1

일종의 주 콘텐츠 영역 (MainContent)이 포함 된보기 (MainView)가 있습니다. View는 대응하는 ViewModel (MainViewModel)에 의해 지원됩니다. 메인 컨텐츠는 물론 애플리케이션의 현재 상태를 기반으로 변경되며 ViewModel에서 속성 (CurrentPrimaryViewModel)으로 표시됩니다. MainContent의 내용은 지금과 같은 XAML에 CurrentPrimaryViewModel에 바인딩 :WPF, WVVM, Databinding 및 ResourceDictionaries

Content="{Binding Path=CurrentPrimaryViewModel}" 

이 ViewModel->보기 매핑 DataTemplates의 무리를 포함하는 ResourceDictionary에있다. 따라서 CurrentPrimaryViewModel이 XViewModel 유형 인 경우 XView로 해석됩니다.

이 모든 것은 작동합니다.

CurrentPrimaryViewModel이 변경 될 때마다 새로운보기가 만들어지는 것이 문제입니다. 내가 바라는 점은 적절히 매핑 된 View가 DataContext를 올바른 ViewModel로 변경 한 다음 해당 View를 MainContent가되도록 만드는 것입니다. 기본적으로 CardStack을 좋아합니까? Java의 레이아웃 또는 보이는 탭이없는 TabControl.

이 상황을 처리하기위한 적절한 기술은 무엇입니까? MainContent 래퍼 아래 다양한 뷰를 만들고 가시성 또는 Z- 순서를 전환해야합니까? 이것에 좋은 패턴이 있습니까? 이를 달성하기 위해 MainView와 MainViewModel 사이에 어떤 바인딩이 필요합니까?

답변

0

AFAIK 이렇게 할 수있는 컨트롤이 없습니다. 그러나, 나는이 일을 극적으로 쉽게 할 수 있다고 생각한다. (무지가 행복하다, 너도 알다시피). 당신이해야 할 일은 ContentControl에 대한 템플릿을 캐시하는 사용자 정의 DataTemplateSelector을 만드는 것입니다.

+0

다양한 사용 가능한 DataTemplates를 알고있는 MainContent의 각 인스턴스에 대해 사용자 지정 DataTemplateSelector를 만들어야하지 않겠습니까? 방금 CurrentItemKey 종속성 속성과 ItemKey 첨부 속성이있는 작은 SelectorPanel을 작성했습니다. SelectorPanel은 하위 컨트롤을 반복하고 ItemKey가 CurrentItemKey와 일치하는지 여부에 따라 표시 여부를 전환합니다. 그것은 조잡하지만 작동합니다. – od9

+0

@ od9 데이터 형식이 유형과 일치합니다. 따라서 하나의 DataTemplateSelector를 리소스로 만들고 템플릿 인스턴스를 공유해야하는 모든 곳에서 리소스를 사용하면됩니다. DTS 내에서 유형/템플릿 인스턴스 사전을 보관하고 새 인스턴스를 만들거나 전송할 수 있습니다. – Will