C# WPF 如何将嵌套 class 绑定到 "Datagrid Row-Details" 中的嵌套数据网格?

C# WPF How to bind a nested class to nested datagrid in "Datagrid Row-Details"?

如何将嵌套 class 中的数据绑定到嵌套数据网格?为什么嵌套数据网格无法读取 class?我在做什么错误?

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
        public Marks myMarks { get; set; }
    }

    public class Marks
    {
        public double English { get; set; }
        public double Maths { get; set; }
        public double Science { get; set; }
    }

主数据网格的项目源

private void Page_Loaded(object sender, RoutedEventArgs e)
{
   List<Student> myStudents = new List<Student>();

    Marks JohnMark = new Marks();
    JohnMark.English = 75;
    JohnMark.Maths = 85;
    JohnMark.Science = 95;

    Marks RichardMark = new Marks();
    RichardMark.English = 70;
    RichardMark.Maths = 80;
    RichardMark.Science = 90;

    Marks SamMark = new Marks();
    SamMark.English = 72;
    SamMark.Maths = 82;
    SamMark.Science = 92;

    myStudents.Add(new Student() { Id = 1, Name = "John Doe", Birthday = new DateTime(1971, 7, 23), myMarks = JohnMark });
    myStudents.Add(new Student() { Id = 2, Name = "Richard Doe", Birthday = new DateTime(1974, 1, 17), myMarks = RichardMark });
    myStudents.Add(new Student() { Id = 3, Name = "Sammy Doe", Birthday = new DateTime(1991, 9, 2), myMarks = SamMark });

    DG_myStudents.ItemsSource = myStudents;
}

下面是我的XAML代码,我在class结构中有什么错误吗?请帮助我。

   <DataGrid x:Name="DG_myStudents" RowDetailsVisibilityMode="Visible">
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid x:Name="DG_myMarks" ItemsSource="{Binding myMarks}" />
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

您至少有两个选择:

1) 您可以向 DataGrid 添加行详细信息,以便在用户选择行时显示更多数据字段,如下所示:

使用此代码:

        <DataGrid Name="DG_myStudents" Margin="10" AutoGenerateColumns="False">

        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Id}"></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
            <DataGridTextColumn Header="Birth" Binding="{Binding Birthday}"></DataGridTextColumn>
        </DataGrid.Columns>

        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <Border BorderThickness="0" Background="BlanchedAlmond" Padding="10">
                    <StackPanel Orientation="Vertical">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="English: " VerticalAlignment="Center" />
                            <TextBlock Foreground="MidnightBlue" Text="{Binding myMarks.English}"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Maths: " VerticalAlignment="Center" />
                            <TextBlock Foreground="MidnightBlue" Text="{Binding myMarks.Maths}"/>
                        </StackPanel>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

2) 使用像这样的简单列:

要使用此代码,请:

   <DataGrid  Name="DG_myStudents" Margin="10" AutoGenerateColumns="False">

        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Id}"></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
            <DataGridTextColumn Header="Birth" Binding="{Binding Birthday}"></DataGridTextColumn>

            <DataGridTextColumn Header="Engleza" Binding="{Binding myMarks.English}" />
            <DataGridTextColumn Header="Maths" Binding="{Binding myMarks.Maths}" />
        </DataGrid.Columns>

    </DataGrid>

它通过将 "myMarks" 修改为集合(例如列表)

来编辑 "class Student" 以这种方式解决
public class Student
 {
   public int Id { get; set; }
   public string Name { get; set; }
   public DateTime Birthday { get; set; }
   public List<Marks> myMarks { get; set; } = new List<Marks>();
 }

然后在list-myStudents中稍作修改

private void Page_Loaded(object sender, RoutedEventArgs e)
 {
   List<Student> myStudents = new List<Student>();

   Marks JohnMark = new Marks();
   JohnMark.English = 75;
   JohnMark.Maths = 85;
   JohnMark.Science = 95;

   Marks RichardMark = new Marks();
   RichardMark.English = 70;
   RichardMark.Maths = 80;
   RichardMark.Science = 90;

   Marks SamMark = new Marks();
   SamMark.English = 72;
   SamMark.Maths = 82;
   SamMark.Science = 92;

   Student stud = new Student() { Id = 1, Name = "John Doe", Birthday = new DateTime(1971, 7, 23) };
   stud.myMarks.Add(JohnMark);
   myStudents.Add(stud);
   stud = new Student() { Id = 2, Name = "Richard Doe", Birthday = new DateTime(1974, 1, 17) };
   stud.myMarks.Add(RichardMark);
   myStudents.Add(stud);
   stud = new Student() { Id = 3, Name = "Sammy Doe", Birthday = new DateTime(1991, 9, 2) };
   stud.myMarks.Add(SamMark);
   myStudents.Add(stud);
   DG_myStudents.ItemsSource = myStudents;
 }

感谢来自 Microsoft 问答论坛的 Peter Fleischer。