2014-11-17 2 views
0

Возможно ли исключить WPF TabControl для выгрузки дочерних элементов TabItem при выборе другой вкладки?WPF TabControl: дети выгружаются, когда выбрана другая вкладка

Проблема я столкнулся похож на описанный здесь: WPF TabControl - Preventing Unload on Tab Change?

решение при условии, кажется, работает только если TabControl привязан к данным. Это не работает, если вы добавите TabItems:

<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 содержит UserControl, содержащий связанный с данными TreeView: TreeViewItem.IsSelected привязан к свойству. Установка свойства, связанного с IsSelected, выбирает соответствующий TreeViewItem. Если пользователь переключается на другую вкладку, TreeView выгружается (удаляется из VisualTree). В этой ситуации установка IsSelected на true на любом узле, не имеющем соответствующий TreeViewItem, вызывает неправильное поведение TreeView - возможно, потому, что TreeView не создает TreeViewItem для узла, который должен быть выбран, потому что TreeView в настоящее время не является частью визуального дерева , Поэтому я хочу, чтобы я мог выбрать любой другой узел, установив IsSelected в true - даже если TreeView находится на невидимой вкладке. Перемещение TreeView в какое-то место вне TabControl, похоже, разрешает проблему - даже если она находится внутри панели, которая имеет видимость. Таким образом, видимость не кажется проблемой, но тот факт, что TreeView в настоящее время не является частью визуального дерева.

ответ

0

Решение, представленное в исходном вопросе работает, если переопределить шаблон управления на основе шаблона управления по умолчанию в TabControl: - Удалить ContentPresenter - Добавление сетки с именем PART_ItemsHolder.

Больше не выгруженных событий - больше никаких проблем с TreeView, если он находится на не выбранном TabItem.

Смежные вопросы