2013-04-22 2 views
2

WPF 응용 프로그램에서 데이터 바인딩 문제가 있습니다. 상황은 다음과 같습니다.WPF. 템플릿 선택기의 컨트롤 간의 바인딩

두 개의 컨트롤 (트리보기가있는 컨트롤과 목록의 항목에 대한 자세한보기)이 있습니다. 다음 코드로 모든 작업 (바인딩)을 수행했습니다.

<avalonDock:LayoutAnchorablePaneGroup DockWidth="230" Orientation="Vertical">  
    <avalonDock:LayoutAnchorablePane Name="CTTreeLayout"> 
     <avalonDock:LayoutAnchorable Title="CTs"> 
      <treeControl:TreeViewUControl x:Name="TreeViewCTs"> 
      </treeControl:TreeViewUControl> 
     </avalonDock:LayoutAnchorable> 
    </avalonDock:LayoutAnchorablePane> 
    <avalonDock:LayoutAnchorablePane Name="CTInfoLayout"> 
     <avalonDock:LayoutAnchorable Title="Información"> 
      <infoControl:EntityInfoUControl x:Name="InfoControl" SelectedItem="{Binding ElementName=TreeViewCTs, Path=CTViewModel.SelectedItem}"> 
      </infoControl:EntityInfoUControl> 
     </avalonDock:LayoutAnchorable> 
    </avalonDock:LayoutAnchorablePane> 
</avalonDock:LayoutAnchorablePaneGroup> 

선택한 항목이 세부 컨트롤의 종속성 속성이었습니다.

이제 코드에서 avalonDock 태그에서 볼 수 있듯이 Avalondock으로 레이아웃 전략을 변경하고 있습니다. 이는 템플릿 선택자를 사용한다는 것을 의미합니다. 레이아웃 올바르게 작동하지만 바인딩이 끊어졌습니다. 다음은 템플릿의 각 컨트롤이 포함 된 실제 코드입니다.

<avalonDock:DockingManager.LayoutItemTemplateSelector> 
    <layout:PanesTemplateSelector> 
     <layout:PanesTemplateSelector.CTToolTemplate> 
      <DataTemplate> 
       <treeControl:TreeViewUControl x:Name="TreeViewCTs"/> 
      </DataTemplate> 
     </layout:PanesTemplateSelector.CTToolTemplate> 
     <layout:PanesTemplateSelector.CTInfoToolTemplate> 
      <DataTemplate> 
       <infoControl:EntityInfoUControl x:Name="InfoControl" SelectedItem="{Binding CTViewModel.SelectedItem, ElementName=TreeViewCTs}"/> 
      </DataTemplate> 
     </layout:PanesTemplateSelector.CTInfoToolTemplate> 
    </layout:PanesTemplateSelector> 
</avalonDock:DockingManager.LayoutItemTemplateSelector> 

바인딩을 다시 업데이트하려면 어떻게해야합니까? 필자는 FindAncestor를 사용해 보았습니다.

편집 :

마지막으로 해결되었습니다. 딘 초크 (Dean Chalk)가 말했듯이 내 전략에 따라 목표를 달성 할 수 없었습니다. 몇 가지 두통이 난 후에 필자는 데이터 모델을 리팩터링했습니다. 이제 트리 뷰와 상세 뷰를 포함하는 뷰 모델을 살펴 보았습니다. AvalonDock 2.0 MVVM 샘플의 구조를 따르고 있습니다.

Sample here

답변

0

만 런타임에서 DataContext로 설정됩니다 어떤 결합 할 수있을 것입니다 이런 DataTemplate 사용. 다른 컨트롤의 SelectedItem에 대한 가시성이 없으므로 ElementName 바인딩을 사용할 수 없습니다.

실제로 이런 종류의 문제에 대한 간단한 해결책은 아니므로 데이터 모델을 오랫동안 열심히 살펴야합니다.

+0

그건 내가 생각한거야. 각 DataTemplate에서 DataContext에만 액세스했습니다. 나는 두 개의 뷰 모델을 포함하는 메인 뷰 모델을 가지고 있고, 그것들을 메인 뷰 모델로부터 인스턴스화했다. 그러나 SelectedItem 변경에 대해 "InfoControl"에 알리는 방법을 알 수 없습니다. – pete

+0

당신의 명확한 설명을 해주셔서 감사합니다. ;) – pete

관련 문제