Cambiar ListBox ItemTemplate según el tipo de elemento y la opción de vista

Actualmente estoy implementando un cuadro de lista en WPF que tendrá 2 diseños alternativos para sus elementos:

Hasta ahora, he hecho esto usando unDataTrigger para cambiar elItemTemplate Para elListBox y está funcionando bien:

<ListBox ItemsSource="{Binding Runs}" SelectedItem="{Binding SelectedRun}">
  <ListBox.Style>
    <Style TargetType="ListBox">
      <Setter Property="ItemTemplate" Value="{StaticResource tileTemplate}"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding ShowRunsAsIcons}" Value="True">
          <Setter Property="ItemTemplate" Value="{StaticResource iconTemplate}"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListBox.Style>
</ListBox>

sin embargo, elRuns La colección a la que está vinculada la lista también contendrá diferentestipos de objeto:

interface IRunItem
{
  // ...
}

class CompletedRunItem : IRunItem
{
  // ...
}

class PendingRunItem : IRunItem
{
  // ...
}

Cada uno de los tipos de objeto debe tener sus propias plantillas de 'mosaico' e 'icono' (haciendo 4 plantillas en total). ¿Cuál es la mejor manera de activar estas dos propiedades según el valor booleano?ShowRunsAsIcons y el tipo de elemento de la lista?

He considerado usar un par deDataTemplateSelector subclases: una para elegir entre plantillas de mosaico según el tipo de elemento y otra para elegir entre plantillas de iconos según el tipo de elemento, pero esto se siente terriblemente torpe. Siento que debería aprovechar la capacidad de WPF para elegir la plantilla correcta según el tipo de objeto, pero en este caso, no veo cómo combinar eso con las diferentes opciones de vista de la lista.

¿Alguna idea de cómo hacer esto que está más en el espíritu de WPF?

Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta