学生班
public class Student
{
string name;
List<SubjectInfo> subjectInfoList;
....
}
List<SubjectInfo>
列表可以为不同的学生提供不同数量的SubjectInfo
个对象。
SubjectInfo类
public class SubjectInfo
{
string subjectCode;
int marks;
...
}
我想在窗口上显示学生对象的详细信息。由于列表具有不同数量的对象计数,因此我从后面的代码中生成了这些对象。
int i = 10;
foreach (SubjectInfo info in student.SubjectInfoList)
{
TextBox tb = new TextBox();
tb.Width = 200;
tb.Height = 20;
tb.Margin = new Thickness(10, i, 0, 0);
StudentDataGrid.Children.Add(tb);
i += 60;
}
我想从后面的代码绑定此列表列表。但我不知道这样做。
我想绑定student.SubjectInfoList
请帮我从代码隐藏中获取绑定列表对象属性。
修改
这是示例学生对象;
Student student = new Student("Joe", new List<SubjectInfo>() { new SubjectInfo("Subject1", 50), new SubjectInfo("Subject2", 70)});
我的窗口应该是这样的;
注意如果学生共完成4个科目TextBox
次计数为5。
答案 0 :(得分:1)
最好在XAML中完成。 但如果您真的想在代码隐藏中执行此操作,请尝试此操作。 SubjectInfo的字段必须是公共的。
foreach (SubjectInfo info in student.SubjectInfoList)
{
TextBox tb = new TextBox();
///...
tb.DataContext = info;
Binding binding = new Binding("marks");
tb.SetBinding(TextBox.TextProperty, binding);
///...
}
答案 1 :(得分:1)
Pure XAML解决方案:
<Window (... your window attributes) >
....
<Grid x:Name="StudentDataGrid">
<ListView ItemsSource="{Binding SubjectInfoList}">
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type local:SubjectInfo}">
<TextBox Text="{Binding Marks}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Window>
但要让它工作,你必须将你的字段转换为公共属性:
public class Student
{
string name;
public List<SubjectInfo> SubjectInfoList { get; set; }
....
}
和
public class SubjectInfo
{
string subjectCode;
public int Marks { get; set; }
...
}
XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="StudentGrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Student name :" Grid.Row="0" Grid.Column="0"/>
<TextBlock Text="Student marks :" Grid.Row="1" Grid.Column="0"/>
<TextBox Text="{Binding Name}" Grid.Row="0" Grid.Column="1" />
<ListView Grid.Row="1" Grid.Column="1" ItemsSource="{Binding SubjectInfoList}" BorderThickness="0">
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type local:SubjectInfo}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding SubjectCode}"/>
<TextBox Grid.Column="1" Text="{Binding Marks}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Window>
代码:
using System.Collections.Generic;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Student student = new Student("Joe", new List<SubjectInfo>() { new SubjectInfo("Subject1", 50), new SubjectInfo("Subject2", 70) });
StudentGrid.DataContext = student;
}
}
public class Student
{
public string Name { get; set; }
public List<SubjectInfo> SubjectInfoList { get; set; }
public Student(string name, List<SubjectInfo> list)
{
Name = name;
SubjectInfoList = list;
}
}
public class SubjectInfo
{
public string SubjectCode { get; set; }
public int Marks { get; set; }
public SubjectInfo(string subjectCode, int marks)
{
SubjectCode = subjectCode;
Marks = marks;
}
}
}