2009-02-26 4 views
23

Ich kann Daten in meine TabControl bekommen, aber die Header haben Frames um sie herum und ich kann nicht von Tab zu Tab gleiten.Wie kann ich eine List-Auflistung an TabControl-Header in WPF binden?

Was mache ich falsch mit der XAML Bindesyntax auf dieser TabControl?

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 hinter:

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 Glück ur mit wpf tun würde ... Ich habe ähnliches Problem mit Silverlight, weil sie einen ItemSource Konverter nicht unterstützen für Tabcontrol. –

+0

Siehe Christofs Antwort (http://stackoverflow.com/questions/589802/how-can-i-bind-a-list-collection-to-tabcontrol-headers-in-wpf/3196668#3196668) für das XAML zu machen diese Arbeit - Sie benötigen einen TabControl.ContentTemplate-Block für den Inhalt, da die TabControl.ItemTemplate NUR für den Header-Teil der Registerkarte ist. –

Antwort

6

nur binden Sie Ihre Liste auf Ihre TabControl als Itemssource, z.B.

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

Dies gibt Ihnen eine Registerkarte für jedes Objekt im Kunden.

+2

Danke, das hat mich weiter gebracht, aber ich kann jetzt nicht von Tab zu Tab klicken und die Headertexte haben Frames um sie herum. Ich habe den neuen Code oben gepostet, was muss geändert werden, damit ich einfach Daten in den Header und den Inhalt der Tabs binden kann? –

+1

Das ist mein Problem - alles funktioniert, außer dass ich die Tabs nicht durch Klicken auf den Kopftext auswählen kann, wodurch TabControl fast nutzlos wird. – LineloDude

46

Hier IST, was ich

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

Und auf der XAML-Seite

<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

Das funktioniert tatsächlich. :) –

+6

Ah !, 'ContentTemplate'. Vielen Dank! –

Verwandte Themen