TabControl的TabItems共享相同的内容......不想要

时间:2010-08-15 01:05:31

标签: wpf tabcontrol

以下示例xaml使每个选项卡项共享相同的TextBox。这是有道理的,在某种程度上我猜...但它是意想不到的行为,几乎感觉就像一个bug。我在文档中找不到任何解释行为的信息,或者如何正确解决这个问题。

<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的不合理优化;对于不实际的情况,它至少应该是可选的。

3 个答案:

答案 0 :(得分:5)

我怀疑有一种更好的方法可以实现你想要实现的任何目标,但我认为这样可行(会测试但我在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>

答案 1 :(得分:0)

如果您定义一个包含选项卡内容的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>

然后我修改了我的窗口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,以显示每个选项卡的值。

答案 2 :(得分:0)

我有同样的问题,并发现这篇文章解释了为什么会发生这种情况以及如何解决它。这是链接,以防其他人遇到同样的问题:

http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization