Warum machen die Bedienelemente auf der Registerkarte Wiederverwendung von View-Instanzen beim Wechsel der Registerkarte

Ich habe ein WPF-Projekt nach einem MVVM-Muster.

Habe ich ein Steuerelement, enthält ein Register-Steuerelement. Das Register-Steuerelement bindet, um eine beobachtbare Sammlung. Jedes Element in die observable-collection ist ein view-model für einen bestimmten Registerkarte angezeigt werden soll.

Die xaml-Datei der Umsetzung der tab-Steuerelement verwendet eine Daten-Vorlage wählen Sie einen bestimmten Benutzer-Steuerelement anzeigen, je nach dem konkreten Typ der view-Modell-in die observable-collection.

Dem seltsamen Verhalten, das ich beobachten, wenn ich zwischen zwei tabs von einer anderen Art, wird eine neue Instanz des Benutzersteuerelements erstellt. Wenn ich zwischen zwei tabs des gleichen Typs, die WPF nutzt die gleiche Instanz des Benutzersteuerelements, es ändert nur den DataContext auf das Steuerelement.

Dieser hat einige sehr unglückliche Konsequenzen, z.B. beim Wechsel zwischen zwei tabs des gleichen Typs, aber mit unterschiedlichen visuellen Zustand ist, dann ist der visual state transition animation angezeigt wird, wo es nicht sein sollte; sollte die änderung sofort. Auch einige Ausnahmen auftreten, wenn das wechseln zwischen zwei tabs verschiedener Art.

Kann ich dieses Verhalten so ändern Sie die tab-Steuerung halten Sie eine Instanz des Benutzersteuerelements für jede Registerkarte Seite, und nicht "zerstören" die Steuerung, beim Wechsel zu einer anderen Registerkarte.

<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>
InformationsquelleAutor Pete | 2011-02-14
Schreibe einen Kommentar