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

时间:2011-02-14 14:14:35

标签: wpf wpf-controls binding

我有一个遵循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>

1 个答案:

答案 0 :(得分:7)

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