动态添加TabItems

时间:2011-01-18 04:18:33

标签: c# wpf xaml data-binding tabcontrol

我有一个TabControl控件

<TabControl Name="Farms_myVillages"
            ItemsSource="{Binding Villages}">
</TabControl/>

在后面的代码中,我动态地向TabControl添加一些标签,如下所示:

foreach (Village vill in Villages)
{
    TabItem tab = new TabItem();
    tab.Header = vill.Name;
    VillageUserControl c = new VillageUserControl();
    c.DataContext = vill;
    tab.Content = c;
    Farms_myVillages.Items.Add(tab);
}

其中VillageUserControl是处理指定村庄的UserControl。此代码工作正常,它可以获得预期的结果......

问题在于我不希望它出现在代码中,而只是在xaml本身。

我试试这个:

<TabControl Name="Farms_myVillages"
            ItemsSource="{Binding Villages}">
      <TabControl.ItemContainerStyle>
          <Style TargetType="TabItem">
              <Setter Property="Header" Value="{Binding Name}"/>
              <Setter Property="Content">
                 <Setter.Value>
                    <u:VillageUserControl DataContext="{Binding}"/>
                 </Setter.Value>
              </Setter>
          </Style>
      </TabControl.ItemContainerStyle>
</TabControl>

运行之后,它抛出一个异常:“指定的元素已经是另一个元素的逻辑子元素。首先断开它。”

我错过了什么吗?请帮帮我......

3 个答案:

答案 0 :(得分:13)

您设置错误,不应修改ItemContainerStyle,而应修改标题的TabControl.ItemTemplate和内容的TabControl.ContentTemplate

(例外可能与以下事实有关:在样式中只创建了一个VillageUserControl,但样式适用于多个标签项。)

答案 1 :(得分:3)

现在它正在运作:

<TabControl Name="Farms_myVillages" 
           ItemsSource="{Binding Villages}">
       <TabControl.ItemTemplate>
            <DataTemplate>
                 <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
       </TabControl.ItemTemplate>
      <TabControl.ContentTemplate>
            <DataTemplate>
                <u:VillageResources/>
            </DataTemplate>
      </TabControl.ContentTemplate>
</TabControl>

答案 2 :(得分:2)

您在代码中没有此功能的方法是正确的,而不是使用ItemContainerStyle使用ItemTemplateContentTemplate。您可以查看来自Josh Smith的此示例,以使用模板和样式创建选项卡 -

http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026