将DataGrid绑定到几个IEnumerable集合中

时间:2014-09-05 10:36:46

标签: wpf data-binding datagrid

我有3个类:

首先是学生:

public class Student
{
    public int StudentID  { get; set;}

    public string Name  { get; set;}

    public DateTime BirthDate { get; set;}

    public ICollection<StudentToCourse> StudentToCourses { get; set; }

    public Student()
    {
        StudentToCourses = new List<StudentToCourse>();
    }
}

然后课程:

    public class Course
{
    public int CourseID { get; set; }

    public string CourseName { get; set; }

    public ICollection<StudentToCourse> StudentToCourses { get; set; }


    public Course()
    {
        StudentToCourses = new List<StudentToCourse>();
    }

}

带有附加属性的Relation / Intermediate Class StudentToCourse:

    public class StudentToCourse
{
    [Key, Column(Order = 0)]
    public int StudentID { get; set; }
    [Key, Column(Order = 1)]
    public int CourseID { get; set; }
    [Key, Column(Order = 2)]
    public DateTime Date { get; set; }

    public virtual Student Student { get; set; }

    public virtual Course Course { get; set; }

    public int Grade { get; set; }

}

我试图实现的是,在[数据网格]中显示每个学生的身份,姓名和生日, 当用户选择特定学生时,数据网格应显示RowDetailsTemplate,其中包含特定于该学生的课程和相关成绩。 到目前为止,它显示了RowDetailsTemplate中每个学生的成绩/日期,但它没有显示每门课程的名称[课程是自己的收藏]

这是Xaml代码:

<DataGrid Grid.Column="0" ItemsSource="{Binding StudentsList}"  IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">


<DataGrid.Columns>
    <DataGridTextColumn Header="ID" Binding="{Binding StudentID}"/>
    <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
    <DataGridTextColumn Header="BirthDate" Binding="{Binding BirthDate}"/>
</DataGrid.Columns>

<DataGrid.RowDetailsTemplate>

    <DataTemplate>

        <DataGrid ItemsSource="{Binding Path=StudentsToCourses}" AutoGenerateColumns="False">


            <DataGrid.Columns>


                <DataGridTemplateColumn Header="Course">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListBox ItemsSource="{Binding Path=Courses}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTextColumn Header="Grade" Binding="{Binding Path=Grade}" Foreground="Blue"/>
                <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}" Foreground="Blue"/>

            </DataGrid.Columns>

        </DataGrid>

    </DataTemplate>

</DataGrid.RowDetailsTemplate>

更清楚  每个学生都有StudentToCourses集合,其中包含成绩属性,日期属性和课程集合,其中包含CourseName属性。 我需要显示[In RowDetailsTemplate]课程名称|等级|来自DataGrid的每个选定学生的日期。

我会感激任何帮助。

修改 这是我的数据库表:

我有3张桌子:

课程:

CREATE TABLE [dbo].[Courses]
(
[CourseID] INT NOT NULL PRIMARY KEY IDENTITY,
[CourseName] NVARCHAR(100) NOT NULL,
)

生:

CREATE TABLE [dbo].[Students]
(
[StudentID] INT NOT NULL PRIMARY KEY IDENTITY,
[Name] NVARCHAR(50) NOT NULL,
[BirthDate] DATETIME NOT NULL,
)

关系表StudentsToCourses:

CREATE TABLE [dbo].[StudentsToCourses]
(
[StudentID] INT REFERENCES Students(StudentID) NOT NULL,
[CourseID] INT REFERENCES Courses(CourseID) NOT NULL,
[Date] DATETIME NOT NULL,
[Grade] INT NOT NULL,
PRIMARY KEY (StudentID, CourseID, Date) 
)

2 个答案:

答案 0 :(得分:0)

停止正在做的事情,因为你做错了,如果你继续下去会导致你自己的问题。我们将数据库表映射到属性的代码类列,或者至少不是。例如,如果Students数据库表具有Courses表的外键,则向Course类添加Course类型为Student的属性

继续此示例,如果您有一个StudentCourses加入表,这意味着每个Course可以有多个Student,而每个Student可以有多个Course {1}},然后将Courses集合属性添加到Student类,并将Students集合属性添加到Course类。

现在你可能会想'这怎么可能?',但事实是你的用户界面将集中在Student Course,所以无需一直完全填充所有这些属性...您只需填充您正在处理的特定视图所需的内容。完成后,Binding Path会更简单,您应该能够自己管理它们。

答案 1 :(得分:0)

在RowDetailsTemplate中,删除课程DataGridTemplateColumn并将其替换为:

<DataGridTextColumn Header="Course" Binding="{Binding Path=Course.CourseName}" Foreground="Blue"/>