2013-04-11 7 views
4

I를 기초 뷰 모델에 의해 관리되는 문서 집합 표시하는 AvalonDock (2.0) DockingManager 제어를 이용한 제어 가지고AvalonDock (2.0) + MVVM + VSPackage = 문서 선택 문제가 있습니까?

<avalonDock:DockingManager DocumentsSource="{Binding Items}"> 
    <avalonDock:DockingManager.LayoutItemContainerStyle> 
     <Style TargetType="{x:Type avalonDockControls:LayoutItem}" BasedOn="{StaticResource DocumentItem}"/> 
    </avalonDock:DockingManager.LayoutItemContainerStyle> 
    <avalonDockLayout:LayoutRoot> 
     <avalonDockLayout:LayoutPanel Orientation="Horizontal"> 
      <avalonDockLayout:LayoutDocumentPane/> 
     </avalonDockLayout:LayoutPanel> 
    </avalonDockLayout:LayoutRoot> 
</avalonDock:DockingManager> 

문서 뷰 모델은 IsSelected 특성을 갖고, 상기 볼 모델 때 선택한 후 DockingManager에 문서를 선택하여 표시하고 싶습니다.

<Style x:Key="DocumentItem" TargetType="{x:Type avalonDockControls:LayoutItem}"> 
    <Setter Property="Title" Value="{Binding Model.TabTitle}"/> 
    <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/> 
</Style> 

이 방식은보기에서 문서를 선택, 컨트롤이 WPF 응용 프로그램 내에서 호스팅되는 경우 잘 작동하지만 컨트롤이 VSPackage 내에서 호스팅되는 경우 다음과 같이이 작업을 수행하기 위해, 나는 LayoutItemStyle 업데이트 모델은 선택한 문서를보기에 가져 오지 않는 경우가 많습니다. 아래 이미지에서 사용자가 편집 할 고객 노드를 클릭했지만 고객 문서가 보이지 않았습니다.

AvalonDock issue

뷰 모형 층은 예상대로 IsSelected 설정되고, 제어가 TabControl을 이용할 때 항상 선택된 문서가 상단에 나타내었다.

AvalonDock에서 문제가되는 것 같습니다. 내가 찾은 것은 뷰 모델을 통해 LayoutItem이 선택되었을 때 목록의 첫 번째 문서가 LayoutDocument/LayoutContent/LayoutElement 레이어에서 true로 다시 선택되는 경우입니다.이 레이어는 다시 물방울로 흐르고 LayoutItem 레이어에서 IsSelected을 true로 재설정합니다. 내 IsSelected을 내보기 모델의 LayoutDocument/LayoutContent/LayoutElement 레이어에 바인딩하고 싶지만 해당 레이어에는 DependencyProperty이 없습니다.

IsSelected을 내보기 모델에 바인딩하는 대체 방법을 시도했지만 지금까지 성공하지 못했습니다. 다른 사람이이 문제에 부딪 혔습니까? 어떤 해결 방법이나 다른 접근법을 알고 있습니까? 나는 비 MVVM 접근 방식을 사용하는 것에 의존하는 것을 싫어한다. 단지 문서 선택을하는 것이다.

편집 : 그것은이 문제처럼 보인다 수도 모호한, 나는 어려움도 VSPackage와 함께, 재생 테스트 케이스를 작성하는 데 문제가있다. 이중 ToolWindow 및 중재자 메시지를 사용하여 실제 컨트롤을 시뮬레이트하는 다음 테스트 케이스에서는 문서 선택이 올바르게 작동합니다.

Tool Windows

(A WPF 응용 프로그램과 VSPackage 포함)이 테스트 케이스 here을 볼 수 있습니다 (선택하거나 생성에서 문서를 선택 도구 창을 실행하고, 하나 개의 창에서 문서 제목을 입력 Tools=>My command name 클릭 DockingManager이있는 창).

답변

2

저는 다른 사람들이이 문제에 어떤 식 으로든 빠져 나갈 것이므로 더 좋은 해결책이 있어야합니다.

  1. 은 내가 LayoutItem 스타일로 내 문서보기 모델에 바인딩 같은 IsSelected을 유지 : 순간

    , 나는 일에 문서의 선택을받을 수있는 끔찍한 해킹 있습니다.
  2. 주보기 모델에서 SelectedItem 속성을 추가하여 어떤 문서가 프로그래밍 방식으로 (편집 이벤트 등으로) 선택되었는지 추적합니다.
  3. DocumentManager 컨트롤에 ActiveContentChanged에 대한 이벤트 처리기를 추가했으며,이 메서드에서 선택하지 않은 경우 내 뷰 모델에서 SelectedItem을 다시 선택합니다. AvalonDock은 포기하기 전에 목록에서 첫 번째 문서를 다시 선택하기 위해 여섯 번 시도합니다!
  4. DocumentManager 컨트롤에 PreviewMouseDown에 대한 이벤트 처리기를 추가했으며이 메서드에서 사용자가 시작한 선택이 계속 작동하도록보기 모델 SelectedItem을 null로 지정했습니다.

다시 한 번 더 나은 답변을 찾아보십시오.

+1

저는 VS 내부에서 Avalon과 작업하지 않았습니다 (2010/12입니까?) -하지만 비슷한 문제가 많이 있습니다 (다른 Avalon 구성 요소). 하나의 질문, 그냥 '유머 나':) - 전체 문제를 유발하는 '문서 선택'이 마우스 또는 키보드에서 발생합니까? (즉, 이벤트의 근본적인 '출처'). 그리고 btw. 간단한 재구성 프로젝트가 있습니까? - 한 번 둘러 볼 수는 있지만 시간을 들여서 설정할 수는 없습니다. – NSGaga

+0

VS2010에서 문제가 발생했습니다. 2012 년 아직 시도하지 않았습니다. 사용자가 문서를 편집하도록 선택하면 문제를 유발하는 문서 선택이 발생합니다. Mediator 디자인 패턴을 사용하는 메시지가 트리보기 컨트롤/창에서 DockingManager가있는 "디자이너"컨트롤/창으로 전송됩니다. 디자이너 뷰 모델에 문서가 없으면 문서가 추가되고 모든 경우에 연관된 문서 뷰 모델의 IsSelected가 true로 설정됩니다. DockingManager의 관점에서 볼 때, 업데이트 된 문서 목록 및/또는 문서 IsSelected의 변경 내용 만보아야합니다. –

+1

오늘은 시간이 없지만 내일 샘플 프로젝트를 만드는 방법을 살펴 보겠습니다. VSPackage 외부에서 오류를 유도하려고 시도합니다. VSPackage에서 DockingManager를 실행하려면 AvalonDock을 GAC 또는 다른 알려진 장소에 설치해야합니다. –