2011-10-27 7 views
2

WPF/Prism 4/AvalonDoc 응용 프로그램에서 작업 중입니다.복합보기 - 이미 영역 오류에있는보기가 있습니다.

내보기 중 하나가 매우 복잡하고 ViewModel이 커지고 관리하기 어려워졌습니다. 그래서 저는 그것을 자신의 ViewModel을 사용하여 더 작은 뷰로 분할하기로 결정했습니다.

"master"ViewModel 생성자의 regionManager.RegisterViewWithRegion 메서드를 사용하여 뷰에 영역을 배치하고 해당 영역에 하위 뷰를로드했습니다.

보기의 인스턴스가 하나만로드 될 때 예상대로 작동합니다. 그러나 그 화면의 두 번째 인스턴스를 열 때 (AvalonDock의 DocumentPane에 DocumentContent로로드 됨) "View already exists in region"오류가 발생합니다.

가능한 경우 지역에 고유 한 이름을 지정하지 마십시오. "마스터"보기의 특정 인스턴스에 하위보기를 추가한다는 것을 나타내는 방법이 있습니까? 이 작업을 수행하는 방법에 대한 조언이 있으십니까?

답변

0

같은 이름을 가진 여러 영역을 가질 수 없다는 두려움이 있습니다. 보기 모델이 복잡 해지면보기를 분할하지 않는 것이 좋습니다. 뷰 모델을 여러 개의 특수 뷰 모델로 분할 할 수 있습니다.

예. 당신은 사용자 관리를 가지고 있습니다. 하나의보기 모델은 모든 사용자의 목록입니다. 이 목록에는 사용자보기 모델이 포함됩니다. 그리고 각 사용자보기 모델에는 사용자 권한보기 모델의 인스턴스가 포함됩니다.이 모델의 인스턴스는 다시 한 번만 사용자 권한을 나타내는보기 모델의 목록입니다. 따라서 특수 사용자 권한을 제시하는 방법에 대한 논리는 "마스터"사용자 목록보기 모델이 아닌 해당보기 모델로 이동합니다. 이렇게하면 관심사를 다른 뷰 모델로 분리 할 수 ​​있습니다.

이러한보기 모델에 바인딩하는 것은보기 모델이 하나만있는 것처럼 간단합니다. 길은 조금 더 길어지고 있습니다. 데이터 컨텍스트가 위 예제의 사용자 목록보기 모델 일 때, CurrentUserVM.UserRightsVM과 같은 바인딩 경로를 사용하여 사용자 권한 목록을 얻을 수 있습니다.

1

당신은 MEF를 사용하고 있고보기 싱글 즉

[PartCreationPolicy(CreationPolicy.Shared)] 

public override bool IsNavigationTarget(NavigationContext navigationContext) 

에 거짓 당신의 INavigationAware 반환하는 경우,이 오류를 얻을 것이다

{false를 반환}.

변경 [PartCreationPolicy(CreationPolicy.Shared)]

[PartCreationPolicy(CreationPolicy.NonShared)]에 당신이 수행됩니다.