为什么选项卡控件在更改选项卡时重用View实例

Pet*_*ete 14 wpf binding wpf-controls

我有一个遵循MVVM模式的WPF项目.

我有一个包含选项卡控件的控件.选项卡控件绑定到可观察的集合.可观察集合中的每个项目都是要显示的特定标签页面的视图模型.

实现选项卡控件的xaml文件使用数据模板来选择要显示的特定用户控件,具体取决于可观察集合中视图模型的具体类型.

我观察到的奇怪行为是,当我在不同类型的两个选项卡之间进行切换时,会创建一个新的用户控件实例.当我在相同类型的两个选项卡之间进行更改时,WPF会重用相同的用户控件实例,它只会更改控件上的DataContext.

这有一些非常不幸的后果,例如当在相同类型的两个选项卡之间进行切换但具有不同的视觉状态时,则显示视觉状态转换动画,其中不应该显示; 变化应该是即时的.在两个不同类型的选项卡之间进行更改时,也会出现一些异

我是否可以更改此行为,以便选项卡控件将为每个选项卡页面保留一个用户控件实例,而不是在切换到其他选项卡时"销毁"控件.

<UserControl.Resources>
    <DataTemplate DataType="{x:Type ViewModels:ConcreteViewModel1}" d:IsDataSource="true">
        <Views:ConcreteView1 />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModels:ConcreteViewModel2}" d:IsDataSource="true">
        <Views:ConcreteView2/>
    </DataTemplate>
    ...
</UserControl.Resources>

<Grid x:Name="ControlTabLayoutRoot">
    <TabControl Grid.Row="0" x:Name="Main_TabControl"
        ItemsSource="{Binding MainTabControl}"
        SelectedIndex="{Binding SelectedIndex}" 
        IsSynchronizedWithCurrentItem="True"
        HorizontalContentAlignment="Stretch" 
        VerticalContentAlignment="Stretch"
        ItemContainerStyle="{DynamicResource CustomTabItemStyle}"
        Style="{DynamicResource CustomTabControl}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>                 
                <TextBlock.Text>
                  <MultiBinding Converter="{StaticResource tabItemHeaderConverter}">
                      <MultiBinding.Bindings>
                          <Binding/>
                          <Binding Path="ProtocolName"/>
                      </MultiBinding.Bindings>
                  </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    </TabControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)

Ric*_*key 7

A TabControl在内部回收虚拟化.您可以在StackOverflow问题中找到两种不同的方法来防止这种情况: