出于某种原因,我很遗憾在将TabControl
绑定到ItemsSource
视图模型时,我的ObservableCollection
可以正常显示。我的设计基于这里的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。我确实在这里发现了一些像我这样的问题,但没有一个问题解决了我
这是我在xaml中的TabControl
。
<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
是视图模型的ObservableCollection
。 ActiveWorkspaceIndex
只是我在视图模型中跟踪的活动工作区索引。我通过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 :(得分:6)
我最终使用ContentControl
和TabControl
数据模板(就像原始教程项目一样)。这是我最终得到的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>