2009-02-26 8 views
23

Je peux obtenir des données dans mon TabControl mais les en-têtes ont des cadres autour d'eux et je n'arrive pas à passer d'un onglet à l'autre. Que dois-je faire de mal avec la syntaxe de liaison XAML sur ce TabControl?Comment lier une collection List aux en-têtes TabControl dans WPF?

XAML:

<StackPanel> 
    <TabControl x:Name="TheTabControl"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TabItem Header="{Binding LastName}"> 
        <StackPanel Margin="10" Orientation="Horizontal"> 
         <TextBlock Text="{Binding FirstName}"/> 
         <TextBlock Text=" "/> 
         <TextBlock Text="{Binding LastName}"/> 
        </StackPanel> 
       </TabItem> 
      </DataTemplate>     
     </TabControl.ItemTemplate> 
    </TabControl> 

    <TabControl> 
     <TabItem Header="Tab1"> 
      <TextBlock Text="This is a test of tab 1"/> 
     </TabItem> 
     <TabItem Header="Tab2"> 
      <TextBlock Text="This is a test of tab 2"/> 
     </TabItem> 
    </TabControl> 

</StackPanel> 
Code

derrière:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     //create all 
     List<Customer> customers = new List<Customer>(); 
     customers.Add(new Customer { FirstName = "Jim", LastName = "Smith", NumberOfContracts = 23 }); 
     customers.Add(new Customer { FirstName = "Jane", LastName = "Smith", NumberOfContracts = 23 }); 
     customers.Add(new Customer { FirstName = "John", LastName = "Tester", NumberOfContracts = 23 }); 

     //show 
     TheListBox.ItemsSource = customers; 

    } 
} 

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int NumberOfContracts { get; set; } 
} 
+0

u chance ur en utilisant WPF ... J'ai problème similaire avec silverlight parce qu'ils ne supportent pas un convertisseur de ItemSource pour tabcontrol. –

+0

Voir la réponse de Christof (http://stackoverflow.com/questions/589802/how-can-i-bind-a-list-collection-to-tabcontrol-headers-in-wpf/3196668#3196668) pour que le XAML fasse ce travail - vous avez besoin d'un bloc TabControl.ContentTemplate pour le contenu puisque le TabControl.ItemTemplate est UNIQUEMENT pour la partie en-tête de l'onglet. –

Répondre

6

bind votre liste à votre TabControl comme ItemsSource, par exemple

<TabControl ItemsSource="{Binding Customers}"/> 

cela vous donnera un onglet pour chaque objet dans le client.

+2

Merci, cela m'a poussé plus loin, mais maintenant je ne peux pas cliquer d'un onglet à l'autre et les textes en-tête ont des cadres autour d'eux. J'ai posté le nouveau code ci-dessus, qu'est-ce qui doit changer afin que je puisse simplement lier les données dans l'en-tête et le contenu des onglets? –

+1

Ceci est mon problème - tout fonctionne, sauf que je ne peux pas sélectionner les onglets en cliquant sur le texte de l'en-tête, ce qui rend le tabcontrol presque inutile. – LineloDude

46

Voici ist ce que je ferais

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //create all 
     var customers = new List<Customer>{ 
      new Customer {FirstName = "Jim", LastName = "Smith", NumberOfContracts = 23}, 
      new Customer {FirstName = "Jane", LastName = "Smith", NumberOfContracts = 23}, 
      new Customer {FirstName = "John", LastName = "Tester", NumberOfContracts = 23}}; 

     //show 
     TheTabControl.ItemsSource = customers; 
     TheTabControl.SelectedIndex = 0; 
    } 


public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int NumberOfContracts { get; set; } 
} 

Et sur le côté XAML

<TabControl x:Name="TheTabControl">    
    <TabControl.ItemTemplate> 
     <DataTemplate>      
      <TextBlock>        
       <TextBlock Text="{Binding FirstName}"/> <TextBlock Text="{Binding LastName}"/> 
      </TextBlock>       
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <TextBlock>        
       This is <TextBlock Text="{Binding FirstName}"/> <TextBlock Text="{Binding LastName}"/> 
      </TextBlock> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 
+0

Cela fonctionne réellement. :) –

+6

Ah !, 'ContentTemplate'. Merci! –

Questions connexes