我有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)
)
答案 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"/>