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。
如何将嵌套 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。