2012-12-23 85 views
8

由于某些原因,我在将ItemsSource绑定到ObservableCollection视图模型时让我的TabControl正确显示。我正在根据这里找到的教程设计我的设计:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。我确实在这里找到了像我这样的几个问题,但没有提到我的特殊情况。 这是我在xaml中的TabControl绑定TabControl ItemsSource到ViewModels的集合

<TabControl ItemsSource="{Binding Workspaces}" 
      SelectedIndex="{Binding ActiveWorkspaceIndex}" 
      ItemTemplate="{StaticResource ClosableTabItemTemplate}"/> 

其中ClosableTabItemTemplate是以下内容。

<DataTemplate x:Key="ClosableTabItemTemplate"> 
     <DockPanel Width="120"> 
      <Button 
       Command="{Binding Path=CloseCommand}" 
       Content="X" 
       Cursor="Hand" 
       DockPanel.Dock="Right" 
       Focusable="False" 
       FontFamily="Courier" 
       FontSize="9" 
       FontWeight="Bold" 
       Margin="0,1,0,0" 
       Padding="0" 
       VerticalContentAlignment="Bottom" 
       Width="16" Height="16" 
       /> 
      <ContentPresenter 
       Content="{Binding Path=DisplayName}" 
       VerticalAlignment="Center" 
       /> 
     </DockPanel> 
     </DataTemplate> 

Workspaces是视图模型的ObservableCollectionActiveWorkspaceIndex只是我在视图模型中跟踪的活动工作空间索引。我通过我的App.xaml文件中的以下数据模板将视图模型与视图实例相关联。

<DataTemplate DataType="{x:Type vm:ViewModelStartPage}"> 
    <v:ViewStartPage/> 
</DataTemplate> 

我只将一个视图模型添加到我的工作区集合中。我看到2个视图显示在选项卡控件中,并且它们不是选项卡。这几乎就像TabControl不知道将不同视图视为TabItems,它的行为更像一个堆栈面板,堆叠视图。如果我在代码中创建选项卡,它可以正常工作,如下所示:

System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem(); 
i.Content = new Views.ViewStartPage(); 
i.Header = "A Tab Item"; 
this.xTabControl.Items.Add(i); 

我必须缺少一些内容模板或其他东西。我将在后期对标签进行样式设计,但现在我很乐意让基本标签工作。此外,选项卡内容中的视图可能会因每个选项卡而不同,因此我无法使用简单的文本块TabControl模板示例,我在各处看到... 即,不是这个...

<TabControl.ContentTemplate> 
    <DataTemplate> 
     <TextBlock 
      Text="{Binding Content}" /> 
    </DataTemplate> 

任何想法?

+0

我在一个测试项目中试过了你的代码,并且TabControl按照预期在这里工作。你可以发布“堆叠”TabControl的图像吗? – Sphinxxx

+0

谢谢你试试看。我最终使用带有TabControl数据模板的ContentControl。这似乎解决了一些问题。老实说,我没有足够的经验来解释为什么这改变了事情,但现在它正在工作。我会发布我的工作代码。 – akagixxer

回答

6

我结束了使用ContentControlTabControl数据模板(如原始教程项目)。这是我结束的xaml代码。我没有更改原始示例项目中的代码隐藏来完成此项工作。 ContentControl位于我的MainWindow.xaml中,另外两个代码位于ResourceDictionary

<!-- Workspaces Tab Control --> 
     <ContentControl Grid.Row="1" 
         VerticalAlignment="Stretch" 
         HorizontalAlignment="Stretch" 
         Content="{Binding Path=Workspaces}" 
         ContentTemplate="{StaticResource WorkspacesTemplate}"/> 

<!-- Workspaces Template --> 
    <DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl Style="{StaticResource ClosableTabControl}" 
       IsSynchronizedWithCurrentItem="True" 
       ItemsSource="{Binding}" 
       ItemTemplate="{StaticResource WorkspaceTabItemTemplate}" 
       Margin="1"/> 
    </DataTemplate> 


<!-- Workspace Tab Item Template --> 
    <DataTemplate x:Key="WorkspaceTabItemTemplate"> 
    <Grid Width="Auto" Height="Auto"> 
     <ContentPresenter ContentSource="Header" Margin="3" 
         Content="{Binding Path=DisplayName}" 
         HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <ContentPresenter.Resources> 
      <Style TargetType="TextBlock"> 
      <Setter Property="Foreground" Value="{StaticResource Foreground}"/> 
      </Style> 
     </ContentPresenter.Resources> 
     </ContentPresenter> 
    </Grid> 
    </DataTemplate> 
相关问题