В следующем примере xaml заставляет каждый элемент вкладки использовать один и тот же TextBox. Это имеет смысл, на некотором уровне, я думаю ... но это неожиданное поведение, и почти похоже на ошибку. И я не мог В документах нет никакой информации, объясняющей поведение или как правильно его обойти.
<TabControl>
<TabControl.Resources>
<Style TargetType="TabItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Name="tab1" />
<TabItem Name="tab2" />
</TabControl>
При переключении между tab1 и tab2 используется один и тот же TextBox, когда я ожидаю новый TextBox для каждой вкладки. Как я могу получить последний случай?
Создание подкласса TabItem и превращение его содержимого в TextBox по умолчанию - это один из способов сделать это, но я просто хочу быть уверен, что мне чего-то не хватает.
Редактировать
Я понимаю, что установка содержимого явно для каждой вкладки решит проблему, но вкладки должны создаваться динамически. Я хочу использовать шаблон содержимого, чтобы я мог добавлять новые вкладки с помощью привязки данных и не делить содержимое, поскольку оно вызывает странное поведение.
Возможно, в текущей реализации TabControl не существует декларативного подхода к решению этой проблемы. Это довольно тривиальная настройка содержимого в коде, но такие вещи всегда чувствуются неправильно в WPF. Мне это кажется неоправданной оптимизацией TabControl; по крайней мере, оно должно быть необязательным для ситуаций, когда это нецелесообразно.
Я подозреваю, что есть лучший способ добиться того, чего вы пытаетесь достичь, но я думаю, что это сработает (можно проверить, но я использую linux atm):
<TabControl>
<TabControl.Resources>
<Style TargetType="TabItem" x:Shared="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Name="tab1" />
<TabItem Name="tab2" />
</TabControl>
Это будет работать, если вы определите usercontrol, в котором есть содержимое вкладки. Я создал следующий usercontrol:
<UserControl x:Class="SO_Testing.TextBoxUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox/>
</Grid>
</UserControl>
Затем я изменил свой window xaml следующим образом:
<Window x:Class="SO_Testing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SO_Testing"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TabControl>
<TabItem Name="tab1" Header="Test">
<local:TextBoxUC/>
</TabItem>
<TabItem Name="tab2" Header="Test 2">
<local:TextBoxUC/>
</TabItem>
</TabControl>
</Grid>
</Window>
Это может быть не совсем то, что вы хотите, но, по крайней мере, расположение каждой вкладки определяется только в одном месте, и вы можете затем назначить datacontext каждому usercontrol, чтобы показать значения для каждой из ваших вкладок.