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