【问题标题】:Binding properties of a lists list in DatagridDatagrid中列表列表的绑定属性
【发布时间】:2016-12-08 19:16:02
【问题描述】:

我正在尝试从其中包含 2 个其他列表的列表中绑定属性,但由于某种原因,它不会在我的数据网格上显示任何内容。

正如您在下面看到的,我创建了一个 observableCollection,当我调试时,该列表具有所有必需的属性(我试图在 XAML 绑定部分添加的属性)但由于某种原因它不起作用。

初始化数据网格的类

        private CategoryServiceClient quizClient = new CategoryServiceClient();
        private IList<Category> quizList;

        public QuizWindow()
        {
            InitializeComponent();
            LoadUserData();
        }

        private void LoadUserData()
        {
            // The GetCategoriesQuestionAnswers method has a list of categories with a 
            // list of questions and a list of answers
            quizList = new ObservableCollection<Category>(quizClient.GetCategoriesQuestionsAnswers());
            try
            {
                quizDatagrid.ItemsSource = quizList;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                throw;

            }
        }

XAML

 <DataGrid x:Name="quizDatagrid" CanUserAddRows="False" Margin="10,90,0,10" ClipboardCopyMode="None" AutoGenerateColumns="False" HorizontalAlignment="Left" Width="698">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding id}" Header="Category ID" />
            <DataGridTextColumn Binding="{Binding name}" Header="Category Name" />
            <DataGridTextColumn Binding="{Binding category.question.id}" Header="Question ID" />
            <DataGridTextColumn Binding="{Binding category.question.description}" Header="Question Description" />
            <DataGridTextColumn Binding="{Binding category.question.answer.id}" Header="Answer ID" />
            <DataGridTextColumn Binding="{Binding category.question.answer.description}" Header="Answer Description" />
            <DataGridTextColumn Binding="{Binding category.question.answer.isCorrect}" Header="Is Correct" />
            <DataGridTextColumn Binding="{Binding category.question.answer.pointAmount}" Header="Point Amount" />
        </DataGrid.Columns>
    </DataGrid>

这是类别类

public class Category
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public int amount { get; set; }
    [DataMember]
    public Quiz quiz { get; set; }
    [DataMember]
    public List<Question> question { get; set; }

    public Category()
    { 
        question = new List<Question>();
    }
}

这是我的问题课

[DataContract(IsReference = true)]
public class Question
{

    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string description { get; set; }
    [DataMember]
    public Category category { get; set; }
    [DataMember]
    public bool isAnswered { get; set; }
    [DataMember]
    public List<Answer> Answers { get; set; }

    public Question()
    {
        Answers = new List<Answer>();
    }
}

【问题讨论】:

  • 您的Category 班级是什么样的?我猜它没有idcategory.question.id 的有效属性
  • 我添加了 Category 类,amount 并且 Quiz 没有在任何地方使用,所以忽略它:)
  • 哦,顺便说一句,“id”和“name”绑定有效,它们显示类别 ID 和类别名称
  • 如果你在代码中写quizList[0].category.question.id,你当然会看到编译器抛出错误。因为Category 不包含名为category 的属性,而List&lt;Question&gt; 不包含名为id 的属性。您需要绑定与代码中的完全匹配...因此您可以为id 编写绑定,因为quizList[0].id 是有效的。或者绑定quiz.id,因为quizList[0].quiz.id 是有效的。你现在看到问题了吗?
  • 感谢您的回答,我正在努力理解它,但您是对的,问题[0].description 对我有用,但是当我尝试时,所有行的 ID 都是 0:问题 [ 0].id ,猜我在某处犯了错误。我试图一遍又一遍地分析你在说什么:P

标签: c# wpf xaml datagrid


【解决方案1】:

DataGrid 只会为其 ItemsSource 中的每个项目添加一行(在本例中为 ObservableCollection),即您将获得每个 Category 对象的一行,而不是每个 Question 对象中的一行一个类别。

它不是分层的。如果您想在同一个 DataGrid 中显示属于特定类别的所有问题,您可以使用包含嵌套 DataGrid 的 DataGridTemplateColumn:

        <DataGrid x:Name="quizDatagrid" CanUserAddRows="False" Margin="10,90,0,10" 
              ClipboardCopyMode="None" AutoGenerateColumns="False" HorizontalAlignment="Left" Width="698">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding id}" Header="Category ID" />
            <DataGridTextColumn Binding="{Binding name}" Header="Category Name" />
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DataGrid ItemsSource="{Binding question}" AutoGenerateColumns="False">
                            <DataGrid.Columns>
                                <DataGridTextColumn Binding="{Binding id}" Header="Question ID" />
                                <DataGridTextColumn Binding="{Binding description}" Header="Question Description" />
                                <DataGridTextColumn Binding="{Binding answer.id}" Header="Answer ID" />
                                <DataGridTextColumn Binding="{Binding answer.description}" Header="Answer Description" />
                                <DataGridTextColumn Binding="{Binding answer.isCorrect}" Header="Is Correct" />
                                <DataGridTextColumn Binding="{Binding answer.pointAmount}" Header="Point Amount" />
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

您可以通过绑定到每个Category对象的问题List中的第一个索引,在同一顶级DataGrid中显示一个类别的第一个问题:

<DataGrid x:Name="quizDatagrid" CanUserAddRows="False" Margin="10,90,0,10" ClipboardCopyMode="None" AutoGenerateColumns="False" HorizontalAlignment="Left" Width="698">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding id}" Header="Category ID" />
        <DataGridTextColumn Binding="{Binding name}" Header="Category Name" />
        <DataGridTextColumn Binding="{Binding question[0].id}" Header="Question ID" />
        <DataGridTextColumn Binding="{Binding question[0].description}" Header="Question Description" />
        <DataGridTextColumn Binding="{Binding question[0].answer.id}" Header="Answer ID" />
        <DataGridTextColumn Binding="{Binding question[0].answer.description}" Header="Answer Description" />
        <DataGridTextColumn Binding="{Binding question[0].answer.isCorrect}" Header="Is Correct" />
        <DataGridTextColumn Binding="{Binding question[0].answer.pointAmount}" Header="Point Amount" />
    </DataGrid.Columns>
</DataGrid>

编辑:您将 DataGrid 的 ItemsSource 设置为 ObservableCollection。每个类别都有一组问题。每个问题都有一个答案集合。 DataGrid 将只为每个类别呈现一行。您只能在此级别上显示一个问题和一个答案:

<DataGridTextColumn Binding="{Binding question[0].id}" Header="Question ID" />
<DataGridTextColumn Binding="{Binding question[0].description}" Header="Question Description" />
<DataGridTextColumn Binding="{Binding question[0].Answers[0].id}" Header="Answer ID" />
<DataGridTextColumn Binding="{Binding question[0].Answers[0].description}" Header="Answer Description

【讨论】:

  • 嗯,我只是得到了 mscorlib.dll 中发生的“System.ArgumentNullException”类型的未处理异常附加信息:值不能为空。当我这样做时。
  • 如果您需要任何进一步的帮助,请提供您的问题的可重现样本,包括所有相关类和样本数据。重点是 DataGrid 只绑定到“第一级”数据。
  • 我今晚完成了编码,但我很感激你的帮助,我只是很困惑,因为你说它只适用于“第一级”,但不知何故我仍然可以绑定到问题列表属性跨度>
  • 您可以通过绑定到每个Category对象中的问题List中的第一个索引,在同一个顶级DataGrid中显示一个类别的第一个问题。有关示例,请参阅我编辑的答案。
  • 那里是一样的。您将 DataGrid 的 ItemsSource 设置为 ObservableCollection。每个类别都有一组问题。每个问题都有一个答案集合。 DataGrid 将只为每个类别呈现一行。您只能在此级别上显示一个问题和一个答案。请参阅我编辑的答案。问题是,当您将 ItemsSource 设置为 ObservableCollection 时,您不能期望 DataGrid 以平面结构为您呈现所有类别、问题和答案,因为它不能以这种方式工作。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 2011-10-25
  • 2014-08-13
  • 2011-04-30
  • 1970-01-01
  • 2023-03-24
  • 2013-08-06
  • 2021-08-26
相关资源
最近更新 更多