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>