wpf - 将 TabControl ItemsSource 绑定(bind)到 ViewModel 集合

标签 wpf xaml binding tabcontrol

出于某种原因,我很想得到我的 TabControl绑定(bind)ItemsSource时正确显示到 ObservableCollection View 模型。我的设计基于此处的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx .我确实在这里找到了一些像我这样的问题,但没有一个能解决我的特殊情况。
这是我的TabControl在xml中。

<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>
WorkspacesObservableCollection View 模型。 ActiveWorkspaceIndex只是我在 View 模型中跟踪的事件工作区索引。我通过 App.xaml 文件中的以下数据模板将我的 View 模型与 View 实例相关联。
<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
     <v:ViewStartPage/>
 </DataTemplate>

我只将一个 View 模型添加到我的工作区集合中。我看到选项卡控件中显示了 2 个 View ,并且它们没有被标记。这几乎就像 TabControl 不知道将不同的 View 视为 TabItems,它的行为更像一个堆栈面板,堆叠 View 。如果我在代码中创建选项卡项,它可以像这样正常工作:
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); 

我一定是缺少一些内容模板或其他东西。我稍后会为我的标签设置样式,但现在我很高兴能让基本的标签正常工作。此外,每个选项卡的选项卡内容中的 View 可能不同,所以我不能使用我在各处看到的简单文本 block TabControl 模板示例......
IE。不是这个...
<TabControl.ContentTemplate>
    <DataTemplate>
        <TextBlock
           Text="{Binding Content}" />
    </DataTemplate>

有任何想法吗?

最佳答案

我最终使用了 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>

关于wpf - 将 TabControl ItemsSource 绑定(bind)到 ViewModel 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14009074/

相关文章:

c# - 从不同的类访问控件

wpf - 类似于 XAML 中的 For 循环

c# - 为 Silverlight 类库打包 ResourceDictionary

python - 即使在理解范围之后,列表理解也会重新绑定(bind)名称。这是正确的吗?

objective-c - 如何在一个对象中设置另一个对象的实例变量?

wpf - 调试 ElementName 绑定(bind)

c# - 如何仅为 DataGrid 中的列子集实现水平滚动条?

wpf - 为具有多个项目的解决方案创建 Wix 安装程序

c# - 为什么TextBlock不是路由事件上的OriginalSource?

wcf - 将客户端 SSL 证书添加到 WCF 绑定(bind)