2012-12-23 9 views
8

Aus irgendeinem Grund habe ich eine Menge Zeit bekommen meine TabControl ordnungsgemäß angezeigt, wenn die ItemsSource zu einem ObservableCollection von Ansicht Modelle binden. Ich stütze mein Design auf das hier gefundene Tutorial: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. Ich habe ein paar Fragen wie meine hier gefunden, aber keine hat meine spezielle Situation angesprochen. Dies ist meine TabControl in XAML.Binding TabControl ItemsSource zu Collection of ViewModels

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

Wo ClosableTabItemTemplate ist das Folgende.

<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 ist die ObservableCollection Sicht Modelle. ActiveWorkspaceIndex ist nur der aktive Arbeitsbereichsindex, den ich im Ansichtsmodell verfolge. Ich verknüpfe mein Ansichtsmodell mit einer Instanz einer Ansicht über die folgende Datenvorlage in meiner App.xaml-Datei.

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

Ich füge nur ein Ansichtsmodell zu meiner Sammlung von Arbeitsbereichen hinzu. Ich sehe 2 Ansichten in der Registerkarte angezeigt und sie sind nicht mit Registern. Es ist fast so, als ob das TabControl die verschiedenen Ansichten nicht als TabItems behandelt, sondern sich eher wie ein Stack-Panel verhält und die Views stapelt. Wenn ich die Registerkarte Elemente im Code erstellen, funktioniert es gut wie folgt:

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); 

Ich muss einige Inhaltsvorlage oder etwas fehlen. Ich werde später meine Tabs gestalten, aber im Moment würde ich mich freuen, wenn ich nur die grundlegenden Tabs funktioniere. Auch die Ansichten in den Tab-Inhalten können für jede Registerkarte unterschiedlich sein, so dass ich nicht die einfachen TabControl-Vorlagen-Beispiele verwenden kann, die ich überall sehe ... I.e. nicht das ...

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

Irgendwelche Ideen?

+0

Ich habe Ihren Code in einem Testprojekt versucht, und das TabControl funktioniert hier wie erwartet. Könntest du ein Bild von der "Stacking" TabControl posten? – Sphinxxx

+0

Danke für den Versuch. Am Ende habe ich ein ContentControl mit einer TabControl-Datenvorlage verwendet. Dies schien die Dinge zu reparieren. Ehrlich gesagt bin ich nicht erfahren genug, um zu erklären, warum dies Dinge verändert hat, aber es funktioniert jetzt. Ich werde meinen Arbeitscode veröffentlichen. – akagixxer

Antwort

6

Ich endete mit einer ContentControl mit einer TabControl Datenvorlage (wie das ursprüngliche Tutorial-Projekt). Hier ist der Xaml-Code, mit dem ich gelandet bin. Ich habe den Code-Behind aus dem ursprünglichen Beispielprojekt nicht geändert, um diese Arbeit zu machen. Die ContentControl ist in meiner MainWindow.xaml und die anderen zwei Teile des Codes waren in einer 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> 
Verwandte Themen