【问题标题】:C# WPF How to bind a nested class to nested datagrid in "Datagrid Row-Details"?C# WPF 如何将嵌套类绑定到“Datagrid Row-Details”中的嵌套数据网格?
【发布时间】:2025-12-22 21:00:10
【问题描述】:

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

    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>

【问题讨论】:

  • 你得到什么结果?
  • 您的输出窗口中是否记录了任何绑定错误?
  • 没什么,嵌套的数据网格“DG_myMarks”没有显示任何数据。当我将“myMarks”绑定到标签以查看那里发生的任何事情时,标签会显示“标记类名称”,例如“MyNameSpace.myPage+Marks”。

标签: c# wpf data-binding datagrid rowdetails


【解决方案1】:

通过将“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>();
 }

然后在列表-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。

【讨论】:

    【解决方案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>
    

    【讨论】: