C# WPF Как связать вложенный класс с вложенной сеткой данных в «Детали строки сетки данных»? - PullRequest
0 голосов
/ 29 апреля 2020

Как связать данные из вложенного класса с вложенной сеткой данных? Почему вложенный датагрид не может прочитать класс? какую ошибку я делаю?

    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; }
    }

itemsource для main-datagrid

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>

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

У вас есть как минимум две опции:

1) Вы можете добавить детали строки в DataGrid, которая представляет больше полей данных, когда пользователь выбирает строку, например:

enter image description here

Используйте этот код:

        <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) Используйте такие простые столбцы, как:

enter image description here

Для этого используйте этот код, пожалуйста:

   <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>
0 голосов
/ 30 апреля 2020

это решается таким образом, редактируя «ученик класса», изменяя «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.

...