如何在WPF中将List集合绑定到TabControl的标头?

23

我可以将数据加载到我的TabControl中,但标题周围有框架,而且我无法从选项卡切换。

在这个TabControl上,我的XAML绑定语法做错了什么?

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>  

代码后台:

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

请参考 Christof 的回答(https://dev59.com/LXRB5IYBdhLWcg3wj32c#3196668)中的 XAML 以使其生效 - 因为 TabControl.ItemTemplate 仅适用于选项卡标题部分,所以您需要一个 TabControl.ContentTemplate 块来处理选项卡内容。 - Robert P
4个回答

54

这是我会做的事情

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

并且在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>

6
啊!ContentTemplate。谢谢! - John Gietzen

7
只需将您的列表绑定到TabControl作为ItemsSource即可,例如:
<TabControl ItemsSource="{Binding Customers}"/>

这将为每个客户对象提供一个选项卡。

2
谢谢,这让我有了进一步的了解,但现在我无法在选项卡之间进行点击,并且标题文本周围有框架。我已经在上面发布了新代码,请问需要更改什么才能将数据绑定到标签页的标题和内容中? - Edward Tanguay
1
这是我的问题--一切工作都正常,除了无法通过点击标题文本来选择标签,这使得选项卡控件几乎没有用处。 - LineloDude

5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接