我需要一些TabItem
来定制Header
。
例如,给定以下(工作)XAML:
<TabControl>
<TabItem>
<TabItem.Header>
<Button>Header 1</Button>
</TabItem.Header>
<Label>Content 1</Label>
</TabItem>
<TabItem>
<TabItem.Header>
<Label>Header 2</Label>
</TabItem.Header>
<Grid>
<TextBlock>Content 2</TextBlock>
</Grid>
</TabItem>
</TabControl>
我想将标签项提取到自己的Views + ViewModels中。 TabItem
的视图仍应为TabItem
,以便我可以为每个标签项配置Header
,而不是设置TabControl.ItemTemplate
并使用{{1}每个标签项实现不同的标题。
与此同时,我需要能够将选定的标签项视图模型绑定到属性DataTemplateSelector
。 =&GT; TabControl的基础视图模型是ActiveItem
(仅应激活选定的选项卡)。
如果可以使用Conductor.Collection.OneActive<T>
作为视图类型,但仍然可以在同一视图中指定TabItem
和Header
,则可以接受也是。
答案 0 :(得分:2)
您应该能够通过将TabControlViewModel
绑定到TabControl
来实现此目标,并且该VM应该具有ObservableCollection
个TabViewModel
s(可能是基类或接口)。您可以将TabViewModel
s集合绑定到TabControl
ItemsSource
。这是我的实现,但是使用Telerik TabControl
(对于MS应该是相同的):
<telerik:RadTabControl x:Name="RadTabControl"
Grid.Row="0"
Align="Justify"
ContentTemplateSelector="{StaticResource LoggerDataTemplateSelector}"
IsContentPreserved="True"
IsDefaultItemSelected="True"
ItemsSource="{Binding LogHistory}"
SupressSelectedContentTemplateReapplying="False">
<telerik:RadTabControl.ItemContainerStyle>
<!-- Allow IsSelected to be bound to view models-->
<Style BasedOn="{StaticResource RadTabItemStyle}"
TargetType="{x:Type telerik:RadTabItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</telerik:RadTabControl.ItemContainerStyle>
<telerik:RadTabControl.ItemTemplate>
<!-- Define what is shown in the header -->
<DataTemplate>
<Grid Height="30">
<TextBlock VerticalAlignment="Center"
Text="{Binding Title}" />
</Grid>
</DataTemplate>
</telerik:RadTabControl.ItemTemplate>
</telerik:RadTabControl>
请注意,MS没有类似IsContentPreserved
的内容,因此切换包含大量数据的标签会非常及时。还有一些其他属性不在MS TabControl
中,但重要的属性应该都在那里。在这种情况下,您的TabViewModel
应该具有IsSelected
属性和Title
属性。