¿Cómo puedo cambiar las plantillas de elementos y contenido según el tipo de objeto?

StackOverflow https://stackoverflow.com/questions/1029324

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo un TabControl de WPF que configuré ItemTemplate y ContentTemplate . Este control de pestaña muestra información del registro de llamadas basada en la información de soporte técnico del cliente.

Dentro de este mismo control, también me gustaría poder mostrar una plantilla ReturnAuthorization .

Me gustaría intercambiarlos en función del tipo de objeto agregado a la colección de elementos de TabControl . ¿Es esto algo posible?

Tengo un pseudocódigo que muestra lo que quiero lograr:

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" ItemContainerStyle="{StaticResource ClosableTabItemTemplate}"  >
        <TabControl.ItemTemplate>
            if ( Type is Entities:Case )
            {
            <DataTemplate DataType="{x:Type Entities:Case}">
                    <TextBlock Text="{Binding Path=Id}" />
            </DataTemplate>
            }
            else if ( Type is Entities1:RAMaster )
            {
            <DataTemplate DataType="{x:Type Entities1:RAMaster}">
                <TextBlock Text="{Binding Path=Id}" />
                </DataTemplate>
            }
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate DataType="{x:Type Entities:Case}">
                <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" />
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
¿Fue útil?

Solución

Una forma de hacer esto es usar algo como un ItemTemplateSelector , que puede establecer en TabControl. Sin embargo, si solo necesita las diferentes plantillas dentro de TabControl y sabe cuáles son todas con anticipación, puede dejarlas se aplicará automáticamente utilizando los DataTypes.

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" ItemContainerStyle="{StaticResource ClosableTabItemTemplate}"  >
    <TabControl.Resources>

        <DataTemplate DataType="{x:Type Entities:Case}">
                <TextBlock Text="{Binding Path=Id}" />
        </DataTemplate>

        <DataTemplate DataType="{x:Type Entities1:RAMaster}">
            <TextBlock Text="{Binding Path=Id}" />
        </DataTemplate>

    </TabControl.Resources>
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type Entities:Case}">
            <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top