WPF TabControl:选择其他选项卡时,子项将被卸载

时间:2014-11-17 22:59:22

标签: wpf treeview tabcontrol onunload

在选择其他标签时,是否可以阻止WPF TabControl卸载TabItem的子项?

我面临的问题类似于此处描述的问题: 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>

当您选择&#34; Second Tab&#34;时,会触发treeView_Unloaded。

背景: 在我的实际应用程序中,其中一个TabItems包含一个包含数据绑定TreeView的UserControl:TreeViewItem.IsSelected绑定到一个属性。将绑定到IsSelected的属性设置为选择相应的TreeViewItem。如果用户切换到另一个选项卡,则卸载TreeView(从VisualTree中删除)。在这种情况下,在没有相应TreeViewItem的任何节点上将IsSelected设置为true会导致TreeView行为异常 - 可能是因为TreeView没有为应该选择的节点创建TreeViewItem,因为TreeView当前不是可视树的一部分。所以我想要实现的是我可以通过将IsSelected设置为true来选择任何其他节点 - 即使TreeView当前位于不可见的选项卡上。将TreeView移动到TabControl外部的某个位置似乎可以解决问题 - 即使它位于可见性崩溃的面板内。因此,可见性似乎不是问题,但TreeView目前不是可视树的一部分。

1 个答案:

答案 0 :(得分:0)

如果您基于TabControl的默认控件模板覆盖控件模板,原始问题中提供的解决方案将起作用: - 删除ContentPresenter - 添加名为PART_ItemsHolder的网格。

没有更多未加载的事件 - 当TreeView位于未选择的TabItem上时,不会再遇到问题。