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

时间:2017-06-08 15:51:36

标签: wpf xaml datatemplate

我有一个带有单个特定选项卡的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>

1 个答案:

答案 0 :(得分:2)

感谢Clemens我发现我的方法正确,我只是在一个标签上缺少绑定:

我有数据错误,但它位于another question :)

<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>