У меня есть проект WPF после шаблона MVVM.
У меня есть один элемент управления, который содержит элемент управления вкладкой. Элемент управления вкладками привязывается к наблюдаемой коллекции. Каждый элемент в наблюдаемой коллекции представляет собой модель представления для определенной страницы вкладки, которая будет показана.
Файл 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>