Здесь есть два совершенно разных использования DataTemplate.
Свойство ItemTemplate имеет тип DataTemplate. В частности, один DataTemplate, а не коллекция. Он ожидает, что вы установите его в соответствии с тем шаблоном, который вам нужен, и именно это он будет использовать для заполнения заголовка вкладки. Кроме того, в случае TabControl это шаблон, который будет применен к всем заголовкам; Вы не можете изменять его отдельно для каждой вкладки.
Сами панели вкладок имеют тип ContentControl, каждая из которых связана с моделью представления. ContentControl содержит ContentPresenter, который перебирает логическое дерево в поисках DataTemplate для типа данных, к которому он был привязан (внутренне свойство DataTemplate DataTemplate просто syntacti c sugar для установки самого типа в качестве x: Key) .
Ваша проблема в том, что вы пытаетесь использовать ItemTemplate как ResourceDictionary, указав несколько DataTemplate, когда вы ожидаете, что вы предоставите сам шаблон, и только один. Таким образом, чтобы реализовать то, что вам нужно, все, что вам нужно сделать, это дать ему DataTemplate и заполнить его ContentPresenter (как это было предложено Dreamer), так же, как и на самой панели вкладок. Этот ContentPresenter имеет свой собственный ResourceDictionary, и здесь вы можете поместить свои шаблоны заголовков:
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.Resources>
<!-- Panel templates -->
<DataTemplate DataType="{x:Type vm:TabViewModel}">
<v:TabView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:NewTabViewModel}">
<v:NewTabView />
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding}">
<ContentPresenter.Resources>
<!-- Header templates -->
<DataTemplate DataType="{x:Type vm:TabViewModel}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:NewTabViewModel}">
<TextBlock Text="+"/>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>