如何根据类型指定内容模板

How to specifiy content template based on type

我有一个带有单个特定选项卡的 TabControl,它包含一个用户控件 (ui:GeneralControl),以及一个绑定到 VM 集合的集合,使用另一个用户控件 (ui:ModelControl)。为此,我使用了 CompositeCollection 和 DataTemplates。

我已经使用目标类型在控件的资源中定义了 DataTemplates,但是它没有像 ContentTemplate 那样正确地被选择。

这段代码有什么问题?

<TabControl>
    <TabControl.Resources>
        <CollectionViewSource x:Key="modelsCollection" Source="{Binding OpenedModels}" /> 
        <DataTemplate DataType="{x:Type main:ProjectViewModel}">
              <ui:GeneralControl />
        </DataTemplate>
        <DataTemplate DataType="{x:Type models:ModelViewModel}">
            <ui:ModelControl />
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemsSource>
        <CompositeCollection>
            <TabItem Header="General" />
            <!--Collection of model tabs -->
            <CollectionContainer Collection="{Binding Source={StaticResource modelsCollection}}"/>
        </CompositeCollection>
    </TabControl.ItemsSource>
    <TabControl.ItemTemplate>
        <DataTemplate DataType="models:ModelViewModel">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

感谢 Clemens,我发现我的方法是正确的,我只是缺少一个选项卡上的绑定:

我有一个数据错误,但它在

<TabControl>
    <TabControl.Resources>
        <CollectionViewSource x:Key="modelsCollection" Source="{Binding OpenedModels}" /> 
        <DataTemplate DataType="{x:Type main:ProjectViewModel}">
              <ui:GeneralControl />
        </DataTemplate>
        <DataTemplate DataType="{x:Type models:ModelViewModel}">
            <ui:ModelControl />
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemsSource>
        <CompositeCollection>
            <TabItem Header="General" Content="{Binding ProjectViewModel}"/>
            <!--Collection of model tabs -->
            <CollectionContainer Collection="{Binding Source={StaticResource modelsCollection}}"/>
        </CompositeCollection>
    </TabControl.ItemsSource>
    <TabControl.ItemTemplate>
        <DataTemplate DataType="models:ModelViewModel">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>