Como preservar o estado de controle nos itens da guia em um TabControl

Sou novato no WPF, tentando criar um projeto que siga as recomendações do excelente artigo de Josh Smith que descreveO Modelo-View-ViewModel Design Pattern.

Usando o código de exemplo de Josh como base, criei um aplicativo simples que contém vários "espaços de trabalho", cada um representado por uma guia em um TabControl. No meu aplicativo, um espaço de trabalho é um editor de documentos que permite que um documento hierárquico seja manipulado por meio de um controle TreeView.

Embora eu tenha conseguido abrir vários espaços de trabalho e exibir o conteúdo do documento no controle TreeView acoplado, acho que o TreeView "esquece" seu estado ao alternar entre as guias. Por exemplo, se o TreeView no Tab1 for parcialmente expandido, ele será mostrado como totalmente recolhido após alternar para o Tab2 e retornar ao Tab1. Esse comportamento parece se aplicar a todos os aspectos do estado de controle para todos os controles.

Após algumas experiências, percebi que posso preservar o estado em um TabItem vinculando explicitamente cada propriedade do estado de controle a uma propriedade dedicada no ViewModel subjacente. No entanto, isso parece muito trabalho adicional, quando eu simplesmente quero que todos os meus controles se lembrem do estado deles ao alternar entre espaços de trabalho.

Suponho que estou perdendo algo simples, mas não sei onde procurar a resposta. Qualquer orientação seria muito apreciada.

Obrigado Tim

Atualizar:

Conforme solicitado, tentarei postar algum código que demonstre esse problema. No entanto, como os dados subjacentes ao TreeView são complexos, publicarei um exemplo simplificado que exibe os mesmos sintomas. Aqui está o XAML na janela principal:

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

O XAML acima se vincula corretamente a um ObservableCollection de DocumentViewModel, pelo qual cada membro é apresentado por meio de um DocumentView.

Para simplificar este exemplo, removi o TreeView (mencionado acima) do DocumentView e o substitui por um TabControl contendo 3 guias fixas:

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

Nesse cenário, não há ligação entre o DocumentView e o DocumentViewModel. Quando o código é executado, o TabControl interno não consegue se lembrar de sua seleção quando o TabControl externo é alternado.

No entanto, se eu ligar explicitamente a propriedade SelectedIndex do TabControl interno ...

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

... para uma propriedade fictícia correspondente no DocumentViewModel ...

public int SelecteDocumentIndex { get; set; }

... a guia interna é capaz de lembrar sua seleção.

Entendo que posso resolver efetivamente meu problema aplicando essa técnica a todas as propriedades visuais de todos os controles, mas espero que exista uma solução mais elegante.

questionAnswers(6)

yourAnswerToTheQuestion