将TabControl.ItemsSource绑定到ViewModel,其View是TabItem

时间:2015-09-17 12:50:00

标签: wpf mvvm

我需要一些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>作为视图类型,但仍然可以在同一视图中指定TabItemHeader,则可以接受也是。

1 个答案:

答案 0 :(得分:2)

您应该能够通过将TabControlViewModel绑定到TabControl来实现此目标,并且该VM应该具有ObservableCollectionTabViewModel 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属性。