Wpf 将TabControl ItemsSource绑定到ViewModels集合

Wpf 将TabControl ItemsSource绑定到ViewModels集合,wpf,xaml,binding,tabcontrol,Wpf,Xaml,Binding,Tabcontrol,由于某些原因,在将ItemsSource绑定到视图模型的可观察集合时,我花了很长时间使我的TabControl正确显示。我的设计基于以下教程:。我确实在这里发现了一些类似我的问题,但没有一个能解决我的特殊情况。 这是我在xaml中的TabControl <TabControl ItemsSource="{Binding Workspaces}" SelectedIndex="{Binding ActiveWorkspaceIndex}" It

由于某些原因,在将
ItemsSource
绑定到视图模型的
可观察集合
时,我花了很长时间使我的
TabControl
正确显示。我的设计基于以下教程:。我确实在这里发现了一些类似我的问题,但没有一个能解决我的特殊情况。 这是我在xaml中的
TabControl

<TabControl ItemsSource="{Binding Workspaces}"
            SelectedIndex="{Binding ActiveWorkspaceIndex}"
            ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
工作空间
是视图模型的
可观察集合
ActiveWorkspaceIndex
只是我在视图模型中跟踪的活动工作区索引。我通过App.xaml文件中的以下数据模板将视图模型与视图实例关联

<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
     <v:ViewStartPage/>
 </DataTemplate>
我一定是缺少一些内容模板之类的东西。稍后我会设计我的标签,但现在我很高兴能让基本的标签正常工作。此外,每个选项卡的选项卡内容中的视图可能不同,因此我不能使用我在各地看到的简单textblock TabControl模板示例。。。 也就是说,不是这个

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


有什么想法吗?

我最终使用了
ContentControl
TabControl
数据模板(就像原来的教程项目一样)。这是我最后得到的xaml代码。我没有更改原始示例项目中的代码来实现这一点。
ContentControl
位于my Main Window.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>


我在一个测试项目中尝试了您的代码,TabControl在这里的工作与预期一样。你能贴一张“堆叠”标签控件的图片吗?谢谢你的尝试。我最终使用了一个带有TabControl数据模板的ContentControl。这似乎解决了问题。老实说,我没有足够的经验来解释为什么这改变了事情,但它现在起作用了。我会发布我的工作代码。
<TabControl.ContentTemplate>
    <DataTemplate>
        <TextBlock
           Text="{Binding Content}" />
    </DataTemplate>
<!-- 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>