Почему элементы управления вкладками повторно используют просмотр экземпляров при изменении вкладки - PullRequest
14 голосов
/ 14 февраля 2011

У меня есть проект WPF по шаблону MVVM.

У меня есть один элемент управления, который содержит вкладку. Элемент управления вкладки привязывается к наблюдаемой коллекции. Каждый элемент в наблюдаемой коллекции является моделью представления для конкретной отображаемой вкладки.

Файл xaml, реализующий элемент управления tab, использует шаблон данных для выбора конкретного пользовательского элемента управления для отображения в зависимости от конкретного типа модели представления в наблюдаемой коллекции.

Странное поведение, которое я наблюдаю, когда я переключаюсь между двумя вкладками другого типа, создается новый экземпляр пользовательского элемента управления. Когда я переключаюсь между двумя вкладками одного типа, 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 Ответ

7 голосов
/ 17 февраля 2011

A TabControl выполняет внутреннюю переработку виртуализации.Вы можете найти два различных подхода к предотвращению этого в вопросах StackOverflow:

...