TabItems TabControl, разделяющие одно и то же содержимое… Не хотят

В следующем примере 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; по крайней мере, оно должно быть необязательным для ситуаций, когда это нецелесообразно.

10
задан gotopie 17 August 2010 в 03:02
поделиться

2 ответа

Я подозреваю, что есть лучший способ добиться того, чего вы пытаетесь достичь, но я думаю, что это сработает (можно проверить, но я использую 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>
5
ответ дан 4 December 2019 в 03:37
поделиться

Это будет работать, если вы определите 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, чтобы показать значения для каждой из ваших вкладок.

0
ответ дан 4 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: