-1

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

    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 代码,我在类结构中是否有任何错误?请帮我。

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

2 回答 2

2

你至少有两个选择:

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>
于 2020-04-30T08:42:12.660 回答
0

通过将“myMarks”修改为集合(例如列表)来编辑“学生班级”以这种方式解决

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。

于 2020-04-30T09:10:30.020 回答