Combinando DataTemplates en tiempo de ejecución

Tengo un ListBox que presenta una lista de objetos enlazada a datos a través de su ItemSource. Debido a que cada objeto tiene necesidades especiales de visualización, estoy definiendo un ItemTemplateSelector que devuelve el DataTemplate apropiado según el objeto. Todo funciona sin problemas.

Las plantillas de datos para cada objeto siguen una fórmula común, pero contienen elementos personalizados en el medio. Por ejemplo:

    <DataTemplate x:Key="collectibleTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Border BorderBrush="LightGray" BorderThickness="1">
                <Expander IsExpanded="True" Header="{Binding ComponentName}" Background="WhiteSmoke">
                    <StackPanel>
                        <TextBlock Margin="5,5,5,0" Text="{Binding EditDescription}" TextWrapping="Wrap" />

                        <!-- This is the only custom part of each template -->
                        <StackPanel Margin="0,10,5,0" Orientation="Horizontal">
                            <Label Content="Type:" />
                            <ComboBox Height="22" HorizontalAlignment="Left" SelectedItem="{Binding Path=CollectibleType, Mode=TwoWay}"
                                            ItemsSource="{Binding Source={StaticResource collectibleTypeFromEnum}}" />
                        </StackPanel>
                        <!-- End custom part -->

                        <StackPanel Margin="0,0,0,5">
                            <Label Content="Available Actions:" >
                                <Label.Style>
                                    <Style TargetType="Label">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding EditActions.Count}" Value="0">
                                                <Setter Property="Visibility" Value="Collapsed" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Label.Style>
                            </Label>
                            <ItemsControl ItemsSource="{Binding EditActions}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Button Command="{Binding}" Content="{Binding Title}" ToolTip="{Binding ToolTip}" Margin="5,0,5,0"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </StackPanel>
                    </StackPanel>
                </Expander>
            </Border>
        </Grid>
    </DataTemplate>

Como puede ver, hay muchos XAML compartidos, que envuelven una pequeña sección personalizada en el medio.

Otros ingenieros redactarán plantillas de datos adicionales (querrán crear uno para cada nuevo tipo de objeto que agreguen), por lo que estoy interesado en hacer que la creación de una nueva plantilla de datos sea lo más infalible e indolora posible. No hay que copiar todo el DataTemplate con las "cosas" personalizadas agregadas en el medio, por supuesto, pero tampoco me gusta extraer partes de la plantilla como partes reutilizables y hacer referencia a ellas porque todavía genera muchos códigos duplicados en cada nuevo DataTemplate, y eso significa posibles errores y mantenimiento difícil. Es decir, esto aquí es un enfoque más fácil de mantener pero todavía se siente subóptimo:

<DataTemplate x:Key="collectibleTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Border BorderBrush="LightGray" BorderThickness="1">
                <Expander IsExpanded="True" Header="{Binding ComponentName}" Background="WhiteSmoke">
                    <StackPanel>
                        <TextBlock Margin="5,5,5,0" Text="{Binding EditDescription}" TextWrapping="Wrap" />

                        <!-- This is the only custom part of each template -->
                        [...]
                        <!-- End custom part -->

                        <ContentPresenter Content="{StaticResource AvailableActions}" />

                    </StackPanel>
                </Expander>
            </Border>
        </Grid>
    </DataTemplate>

    <StackPanel Margin="0,0,0,5" x:Key="AvailableActions" x:Shared="false">
        <Label Content="Available Actions:" >
            <Label.Style>
        <!-- 
        [Bottom half of shared XAML from the first example, offloaded here]
        -->
    </StackPanel>

Entonces: ¿cuál es mi mejor estrategia para resolver esto? AFAIK Estoy atascado con el uso de DataTemplates porque ese es el único elemento que acepta un ListBox ItemTemplateSelector. ¿Hay alguna manera de crear un DataTemplate compuesto en el DataTemplateSelector? Proporcionaría el DataTemplate de stock que comparten todos los objetos y las referencias de DataTemplateSelector en el bit de XAML personalizado necesario para cada tipo de objeto. Otros ingenieros se conectarían a ese comportamiento de código generalizado.

No estoy seguro, buscando un poco en la oscuridad aquí como si hay un patrón que me permita resolver esto con elegancia.

Y, solo como referencia: mi DataTemplateSelector actual es súper sencillo. Aquí es donde esperaría construir el DataTemplate final, en lugar de simplemente devolver uno que esté codificado en XAML.

public class NodeComponentDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null)
        {
            if (item is CollectibleComponent)
                return element.FindResource("collectibleTemplate") as DataTemplate;

            // [...]
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta