Vinculando a ItemsSource do TabControl no WPF

Eu estou em uma ligação (sem trocadilhos) quando se trata de minhas necessidades atuais de ligação no WPF. Passei a maior parte do dia tentando pesquisar meu problema e não consigo encontrar uma solução sólida para o meu problema. Aqui está:

Eu estou tentando criar um controle de usuário que representa o que eu estou chamando de um espaço de trabalho (uma referência de um blog por Josh Smith). Os espaços de trabalho serão exibidos em um controle de guias. Eu estou com o objetivo de usar uma interface com guias para gerenciar vários documentos que eu tenho aberto muito como em um navegador de um livro de trabalho excal.

Cada vez que um usuário exibe uma nova área de trabalho, essa área de trabalho deve ser exibida no controle da guia. Cada espaço de trabalho assume a forma de um controle de usuário e cada espaço de trabalho possui seu próprio modelo de exibição. Eu gostaria que o Cabeçalho de Tabelas exibisse uma propriedade do meu modelo de visualização que, provavelmente, teria que ser exposto como uma propriedade por meio do meu controle de usuário.

Até agora, a solução mais limpa que eu gostei da melhor até que eu corri em vários problemas foi usando datatemplates. Basicamente eu fiz o seguinte:

<DataTemplate x:Key="WorkspaceItem">
            <DockPanel Width="120">
                <ContentPresenter 
                    Content="{Binding Title}" 
                    VerticalAlignment="Center" 
                    />
            </DockPanel>
        </DataTemplate>     

<DataTemplate DataType="{x:Type CustomerViewModel}">
   <workspace:CustomerWorkspace />
</DataTemplate>

<TabControl ItemsSource="{Binding Workspaces}" ItemTemplate="{StaticResource WorkspaceItem}"/>

O TabControl.ItemsSource está vinculado a um observablecollection (de Object) que contém todos os meus espaços de trabalho.

Isso funciona muito bem, exceto por duas coisas:

Se eu abrir vários clientes, tenho vários espaços de trabalho abertos. Por causa do DataTemplate Recycling, eu perco o estado quando eu permuto de uma guia para outra. Então tudo o que não está vinculado perderá o estado.

O desempenho de trocar entre espaços de trabalho diferentes (que usam diferentes datatemplates) é terrivelmente lento.

Então ... Eu encontrei uma sugestão de outro usuário no SO para adicionar os controles de usuário ao ObservableCOllection e abandonar os modelos de dados. que agora resolve um dos problemas de perder o estado. no entanto, agora estou diante de dois problemas restantes:

Como faço para definir a propriedade TabItem.Header sem usar um DataTemplateA velocidade de troca entre as guias ainda é lenta, a menos que sejam do mesmo DataTemplate.

Eu então continuei a realmente adicionar um TabItem para o ObservableCollection no meu codebehind e defina a propriedade TabItem.Content para que o controle de usuário. O problema de velocidade agora foi eliminado, assim como o problema do estado de perda, já que removi o uso dos DataTemplates. No entanto, agora estou preso com a questão da ligação de um TabItem.header para a propriedade Custome "Title" do meu usercontrol que deve ser exibido no cabeçalho da guia.

Então, depois deste post terrivelmente longo, minhas perguntas são:

Existe alguma maneira de usar datatemplates e forçá-los a criar uma nova instância para cada item na coleção para evitar a reciclagem e perda de estado.

1a. Existe uma alternativa melhor do que eu mencionei no post acima?

Existe uma maneira de fazer tudo isso através do XAML em vez de através de código de back-end construção de itens de guia?

questionAnswers(1)

yourAnswerToTheQuestion