无法将TabControl绑定到ObservableCollection

问题描述

搜索了其他类似的问题,但仍然无法将我的收藏绑定到TabControl。 我设法以编程方式添加标题内容。但是,我想使用DataBinding

我定义了带有属性的Struct。我将其插入一个公共的ObservableCollection中,并尝试将其绑定到TabControl。

这是结构的C#代码

   public struct ProbDiffList
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ProbDiffList"/> struct.
    /// Construit une structure avec un identifiant de niveau et une liste de Problème à résoudre.
    /// </summary>
    /// <param name="diff">Niveau de difficulté.</param>
    /// <param name="lstProbleme">List de nom de Problème.</param>
    public ProbDiffList(string diff,List<string> lstProbleme)
    {
        NiveauProb = diff;
        LstProbName = lstProbleme;
    }

    /// <summary>
    /// Gets l'identification du niveau.
    /// </summary>
    public string NiveauProb { get; private set; }

    /// <summary>
    /// Gets la liste des problèmes.
    /// </summary>
    public List<string> LstProbName { get; private set; }
}

这是XAML

           <TabControl x:Name="GamesList"
                    Margin="10"
                    Padding="10"
            DataContext="probClasser">

            <TabItem Header="{Binding probClasser/NiveauProb}"
                         FontWeight="Bold"
                         FontSize="14" >
                <ListBox ItemsSource="{Binding probClasser/LstProbName}"></ListBox>
            </TabItem>
        </TabControl>

和c#部分

    /// <summary>
    /// Liste des problème pour BINDING avec les titres.
    /// </summary>
    public static ObservableCollection<ProbDiffList> probClasser;

    public MainWindow()
    {
        InitializeComponent();
        DataContext = probClasser;
    }

    /// <summary>
    /// Affichera la liste des Sudokus à résoudre classé par catégorie.
    /// </summary>
    /// <param name="argProb">List niveau List infoProb.</param>
    public void AfficheChoixProblème(List<ProbDiffList> argProb)
    {
        probClasser = new ObservableCollection<ProbDiffList>();
        GamesList.Visibility = Visibility.Visible;
        foreach (ProbDiffList uneListeParDiff in argProb)
        {
            probClasser.Add(uneListeParDiff);
        }
    }

显示 Expected result

解决方法

您应该绑定TabControl的ItemsSource,而不是显式创建TabItem,而是设置ItemTemplate和ContentTemplate:

<TabControl ItemsSource="{Binding}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding NiveauProb}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ListBox ItemsSource="{Binding LstProbName}"/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...