Прежде всего, здесь задействованы два шаблона:
TabControl.ItemTemplate
, используемый для визуализации TabItem
заголовков TabControl.ContentTemplate
, используемых для визуализации TabItem
содержание
Если вы не установите эти свойства явно, WPF попытается разрешить их в другом месте.Он будет перемещаться по логическому дереву в поисках ресурса, сообщающего ему, как визуализировать вашу модель представления.Если он находит DataTemplate
, который имеет соответствующий DataType
, но не имеет ключа, он будет использовать его для визуализации модели представления.Если он не найдет его, по умолчанию будет отображаться значение ToString
объекта.
Итак, если вы хотите быть явным, вам нужно что-то вроде этого:
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
Поскольку вы не конкретны, WPF пытается пройтись по вашему логическому дереву, чтобы найти подходящий DataTemplate
.Когда он находит его, он использует его для визуализации модели представления.Там, где он его не находит, он вызывает ToString
и отображает его.
Итак, для решения ваших конкретных случаев:
Просто ItemTemplate
Вы явно указали, как отображать заголовки вкладок, но не содержимое вкладок.Таким образом, первый отображается с использованием предоставленного DataTemplate
, но по умолчанию для второго будет ToString
.
Просто DataTemplate
Вы явно не указали, какотображать заголовки вкладок или содержимое вкладок.Поэтому WPF ищет подходящие DataTemplate
для обоих.Так как оба содержат экземпляр вашей модели представления (это их DataContext
), то один и тот же DataTemplate
будет использоваться для визуализации заголовков вкладок и их содержимого.
ПРИМЕЧАНИЕ: вы явно не указали, что эточто происходит в вашем вопросе.Поправьте меня, если я ошибаюсь.
Оба
В этом случае вы явно указали, как отображать заголовки вкладок, но не содержимое вкладок.Поэтому явный DataTemplate
используется для заголовков вкладок, а неявный DataTemplate
используется для содержимого вкладок.