So erhalten Sie den Steuerungsstatus in Registerkartenelementen in einem TabControl

Ich bin ein Neuling in WPF und versuche, ein Projekt zu entwickeln, das den Empfehlungen von Josh Smiths ausgezeichnetem Artikel folgtDas Model-View-ViewModel-Entwurfsmuster.

Auf der Grundlage von Joshs Beispielcode habe ich eine einfache Anwendung erstellt, die eine Reihe von "Arbeitsbereichen" enthält, die jeweils durch eine Registerkarte in einem TabControl dargestellt werden. In meiner Anwendung ist ein Arbeitsbereich ein Dokumenteditor, mit dem ein hierarchisches Dokument über ein TreeView-Steuerelement bearbeitet werden kann.

Obwohl es mir gelungen ist, mehrere Arbeitsbereiche zu öffnen und deren Dokumentinhalt im gebundenen TreeView-Steuerelement anzuzeigen, wird der Status der TreeView beim Wechseln zwischen Registerkarten "vergessen". Wenn beispielsweise die Strukturansicht in Tab1 teilweise erweitert ist, wird sie nach dem Wechsel zu Tab2 und der Rückkehr zu Tab1 als vollständig reduziert angezeigt. Dieses Verhalten scheint für alle Steuerelemente auf alle Aspekte des Steuerelementstatus anzuwenden.

Nach einigen Experimenten habe ich festgestellt, dass ich den Status in einem TabItem beibehalten kann, indem ich jede Eigenschaft des Steuerelementstatus explizit an eine dedizierte Eigenschaft des zugrunde liegenden ViewModel binde. Dies scheint jedoch eine Menge zusätzlicher Arbeit zu sein, wenn ich einfach möchte, dass sich alle meine Steuerelemente beim Wechseln zwischen Arbeitsbereichen an ihren Status erinnern.

Ich vermute, ich vermisse etwas Einfaches, bin mir aber nicht sicher, wo ich nach der Antwort suchen soll. Jede Anleitung wäre sehr dankbar.

Danke, Tim

Aktualisieren:

Wie angefordert, werde ich versuchen, einen Code zu veröffentlichen, der dieses Problem veranschaulicht. Da die Daten, die der TreeView zugrunde liegen, jedoch komplex sind, werde ich ein vereinfachtes Beispiel veröffentlichen, das dieselben Symptome aufweist. Hier ist die XAML aus dem Hauptfenster:

<TabControl IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=Docs}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding Path=Name}" />
        </DataTemplate>
    </TabControl.ItemTemplate>

    <TabControl.ContentTemplate>
        <DataTemplate>
            <view:DocumentView />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

Die obige XAML bindet korrekt an eine ObservableCollection von DocumentViewModel, wobei jedes Mitglied über eine DocumentView dargestellt wird.

Zur Vereinfachung dieses Beispiels habe ich die TreeView (oben erwähnt) aus der DocumentView entfernt und durch ein TabControl mit 3 festen Registerkarten ersetzt:

<TabControl>
    <TabItem Header="A" />
    <TabItem Header="B" />
    <TabItem Header="C" />
</TabControl>

In diesem Szenario besteht keine Bindung zwischen DocumentView und DocumentViewModel. Wenn der Code ausgeführt wird, kann sich das innere TabControl nicht an seine Auswahl erinnern, wenn das äußere TabControl umgeschaltet wird.

Wenn ich jedoch die SelectedIndex-Eigenschaft des inneren TabControl explizit binde ...

<TabControl SelectedIndex="{Binding Path=SelectedDocumentIndex}">
    <TabItem Header="A" />
    <TabItem Header="B" />
    <TabItem Header="C" />
</TabControl>

... auf eine entsprechende Dummy-Eigenschaft im DocumentViewModel ...

public int SelecteDocumentIndex { get; set; }

... der innere Reiter kann sich seine Auswahl merken.

Ich verstehe, dass ich mein Problem effektiv lösen kann, indem ich diese Technik auf jede visuelle Eigenschaft jedes Steuerelements anwende, aber ich hoffe, dass es eine elegantere Lösung gibt.