2011-02-14 14 views
13

Tengo un proyecto WPF siguiendo un patrón MVVM.Por qué los controles de pestaña reutilizan Ver instancias al cambiar la pestaña

Tengo un control que contiene un control de pestañas. El control de tabulación se une a una colección observable. Cada elemento en la colección observable es un modelo de vista para una página de pestaña específica que se mostrará.

El archivo xaml que implementa el control de tabulación usa una plantilla de datos para seleccionar un control de usuario específico para mostrar, dependiendo del tipo concreto del modelo de vista en la colección observable.

El extraño comportamiento que observo es que cuando cambio de dos pestañas de un tipo diferente, se crea una nueva instancia del control de usuario. Cuando cambio entre dos pestañas del mismo tipo, WPF reutiliza la misma instancia del control de usuario, simplemente cambia el DataContext en el control.

Esto tiene algunas consecuencias muy desafortunadas, por ej. cuando se cambia entre dos pestañas del mismo tipo, pero con diferente estado visual, se muestra la animación de transición de estado visual, donde no debería; el cambio debe ser instantáneo. También se producen algunas excepciones al cambiar entre dos pestañas de diferente tipo.

Puedo cambiar este comportamiento para que el control de pestañas retenga una instancia del control de usuario para cada página de pestañas, y no "destruya" los controles, cuando cambie a una pestaña diferente.

<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> 

Respuesta

Cuestiones relacionadas