我有一个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>
运行之后,它抛出一个异常:“指定的元素已经是另一个元素的逻辑子元素。首先断开它。”
我错过了什么吗?请帮帮我......
答案 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
使用ItemTemplate
和ContentTemplate
。您可以查看来自Josh Smith的此示例,以使用模板和样式创建选项卡 -
http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026