Enlace a ItemsSource de TabControl en WPF

Estoy en un aprieto (sin juego de palabras) cuando se trata de mis necesidades de encuadernación actuales en WPF. He pasado la mayor parte del día tratando de investigar mi problema y no puedo encontrar una solución sólida para mi problema. aquí está:

Estoy tratando de crear un Control de usuario que represente lo que llamo un área de trabajo (una referencia de un blog de Josh Smith). Los espacios de trabajo se mostrarán en un control de pestaña. Mi objetivo es utilizar una interfaz con pestañas para administrar varios documentos que he abierto de manera muy parecida a un navegador de un libro de trabajo de excelencia.

Cada vez que un usuario abre un nuevo espacio de trabajo, ese espacio de trabajo debe mostrarse en el control de pestaña. Cada área de trabajo toma la forma de un control de usuario, y cada área de trabajo tiene su propio modelo de vista. Me gustaría que el Encabezado de la pestaña muestre una propiedad de mi modelo de vista que creo que probablemente tenga que ser expuesta como una propiedad a través de mi control de usuario.

Hasta ahora, la solución más limpia que más me gustaba hasta que encontré numerosos problemas fue mediante el uso de placas de datos. Básicamente hice lo siguiente:

<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}"/>

El objeto TabControl.ItemsSource está vinculado a una colección observable (de Objeto) que contiene todos mis espacios de trabajo.

Esto funciona muy bien, excepto por 2 cosas:

Si abro varios clientes, entonces tengo múltiples espacios de trabajo abiertos. Debido a DataTemplate Recycling, pierdo el estado cuando cambio de una pestaña a otra. Así que todo lo que no esté ligado perderá estado.

El rendimiento del intercambio entre diferentes espacios de trabajo (que utilizan diferentes plantillas de datos) es terriblemente lento.

Entonces ... encontré una sugerencia de otro usuario en SO para agregar los controles de usuario a ObservableCOllection y deshacerse de las plantillas de datos. Que ahora resuelve uno de los problemas de perder estado. Sin embargo, ahora me encuentro con 2 problemas pendientes:

¿Cómo configuro la propiedad TabItem.Header sin usar un DataTemplate?La velocidad de alternar entre las pestañas sigue siendo lenta a menos que sean de la misma DataTemplate.

Luego procedí a agregar realmente un elemento de tabla a la colección observable en mi código y establecer la propiedad de contenido de tabla y el valor del control de usuario. El problema de la velocidad ahora se eliminó, al igual que el estado de pérdida, ya que eliminé el uso de las Plantillas de datos. Sin embargo, ahora estoy atascado con el problema de vincular un encabezado TabItem.header a la propiedad "Título" de mi cliente que debe aparecer en el encabezado de la pestaña.

Así que después de este post terriblemente largo, mis preguntas son:

¿Hay alguna forma de usar placas de datos y obligarlas a crear una nueva Instancia para cada elemento de la colección para evitar el reciclaje y la pérdida de estado?

1a. ¿Hay alguna alternativa mejor que la que mencioné en el post anterior?

¿hay una manera de hacer todo esto a través del Xaml en lugar de hacerlo a través de la construcción del código de back-end de los elementos de la pestaña?

Respuestas a la pregunta(1)

Su respuesta a la pregunta