Переименование/перемещение файлов с суффиксами быстро:
cp /home/foo/realllylongname.cpp{,-old}
Это расширяется до:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old
TabControl содержит свойство ContentTemplate, а также ItemTemplate, которое он наследует от ItemsControl. Он использует ContentTemplate, чтобы различать, что отображается в области Content, и ItemTemplate, который определяет шаблон для заголовка. Кроме того, каждый элемент из вашего ItemSource будет автоматически заключен в TabItem; его не нужно воссоздавать в ItemTemplate, так как это попытается разместить TabItem внутри заголовка, как вы заметили.
Вместо повторного создания TabItem внутри ItemTemplate используйте ItemTemplate для определения вашего Содержимое заголовка и ContentTemplate для определения вашего содержимого.
<TabControl ItemsSource="{Binding}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}--{1}">
<Binding Path="Title" />
<Binding Path="Category.Title" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding MyContent}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
В первом абзаце вы упомянули, что хотите установить разные размеры для связанных частей заголовка. Если вы действительно хотите это сделать, вы выиграли ' t иметь возможность использовать одиночный Binding или MultiBinding для установки текста, как это сделано выше. Вместо этого вы можете вкладывать TextBlocks, чтобы добиться этого с различным форматированием для каждого.
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock Text="{Binding Title}"
FontSize="12" />
<Run Text="--" />
<TextBlock Text="{Binding Category.Title}"
FontSize="10" />
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>