Comment modifier les modèles d'élément et de contenu en fonction du type d'objet?
Question
J'ai un TabControl
WPF que j'ai défini le ItemTemplate
ainsi que le ContentTemplate
. Cet onglet affiche les informations du journal des appels en fonction des informations du support technique du client.
À l'intérieur de ce même contrôle, j'aimerais également pouvoir afficher un modèle ReturnAuthorization
.
Je souhaiterais les échanger en fonction du type d'objet ajouté à la collection Items de TabControl
. Est-ce quelque chose qui est possible?
J'ai un pseudo-code qui montre ce que je veux retirer:
<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>
La solution
Une façon de procéder consiste à utiliser quelque chose comme ItemTemplateSelector , que vous pouvez définir sur TabControl. Toutefois, si vous n'avez besoin que des différents modèles dans TabControl et que vous savez ce qu'ils sont tous à l'avance, vous pouvez simplement les laisser automatiquement être appliqué à l'aide des 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>