2014-11-17 7 views
0

다른 탭을 선택할 때 WPF TabControl이 TabItem의 자식을 언로드하지 않도록 할 수 있습니까?WPF TabControl : 다른 탭을 선택하면 자식이 언로드됩니다.

내가 직면하고있어 문제는 여기에 설명 된 것과 유사합니다 : WPF TabControl - Preventing Unload on Tab Change?

이 솔루션은 TabControl에 데이터 바인딩 된 경우에만 작동하는 것 같다 제공했다.

<local:TabControlEx> 

    <TabItem Header="First Tab"> 
     <TreeView ItemsSource="{Binding TreeNodes}" Unloaded="treeView_Unloaded"> 
      <TreeView.Resources> 
       <DataTemplate DataType="{x:Type local:NodeViewModel}"> 
        <TextBlock Text="{Binding NodeName}" /> 
       </DataTemplate> 
      </TreeView.Resources> 

      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       </Style> 
      </TreeView.ItemContainerStyle> 
     </TreeView> 
    </TabItem> 

    <TabItem Header="Second Tab"> 
     <TextBlock Name="txText2">Second Text 2</TextBlock> 
    </TabItem> 

</local:TabControlEx> 

는 "두 번째 탭"을 선택

는, treeView_Unloaded가 트리거 : 당신이 TabItems을 추가하는 경우 그것은 작동하지 않습니다.

배경 : 내 실제 응용 프로그램에서 TabItem 중 하나는 TreeView에 바인딩 된 데이터를 포함하는 UserControl을 포함합니다 : TreeViewItem.IsSelected는 속성에 바인딩됩니다. IsSelected에 바인딩 된 속성을 설정하면 해당 TreeViewItem이 선택됩니다. 사용자가 다른 탭으로 전환하면 TreeView가 언로드됩니다 (VisualTree에서 제거됨). 이 상황에서 해당 TreeViewItem이없는 노드에서 IsSelected를 true로 설정하면 TreeView가 잘못 작동합니다. TreeView는 현재 시각적 트리의 일부가 아니기 때문에 TreeViewItem을 선택해야하는 노드에 대해 TreeViewItem을 만들지 않기 때문에 . 그래서 내가 달성하고자하는 것은 TreeView가 현재 보이지 않는 탭에 있더라도 IsSelected를 true로 설정하여 다른 노드를 선택할 수 있다는 것입니다. TreeView를 TabControl 외부의 일부 위치로 이동하면 가시성이 축소 된 패널 내부에 있더라도 문제가 해결되는 것으로 보입니다. 따라서 가시성이 문제는 아니지만 TreeView가 현재 시각적 트리의 일부가 아닙니다.

답변

0

TabControl의 기본 컨트롤 템플릿 인 - Remove ContentPresenter - PART_ItemsHolder라는 모눈 추가를 기반으로 컨트롤 템플릿을 재정의하면 원래 질문의 솔루션이 작동합니다.

더 이상 언로드 이벤트 - 선택되지 않은 TabItem에있을 때 TreeView에 더 이상 문제가 없습니다.