我有一个遵循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>
答案 0 :(得分:7)
A TabControl
会在内部回收虚拟化。您可以在StackOverflow问题中找到两种不同的方法来防止这种情况: