WPF如何在ListView中为每个School生成对应DataGrid?
在WPF的ListView中为每个School绑定对应Teachers的DataGrid方案
完全可以实现这个需求,你之前的XAML写法错误在于没有为ListView指定ItemTemplate——ListView的ItemsSource绑定的是Schools集合,每个列表项的上下文是单个School对象,而非整个集合,直接在ListView内部放DataGrid会导致绑定失效。
正确的XAML实现
<ListView ItemsSource="{Binding Schools}"> <ListView.ItemTemplate> <DataTemplate> <!-- 用StackPanel垂直排列学校相关元素和教师表格 --> <StackPanel Margin="0 0 0 15"> <!-- 可选:如果School类添加Name属性,可在此显示学校名称 --> <TextBlock Text="教师列表" FontSize="14" FontWeight="Bold" Margin="0 0 0 5"/> <DataGrid ItemsSource="{Binding Teachers}" AutoGenerateColumns="False"> <!-- 手动定义列,精准控制显示内容 --> <DataGrid.Columns> <DataGridTextColumn Header="姓名" Binding="{Binding Name}"/> <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> <DataGridTextColumn Header="地址" Binding="{Binding Address}"/> <DataGridTextColumn Header="排名" Binding="{Binding Ranking}"/> </DataGrid.Columns> </DataGrid> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
关键说明
ListView.ItemTemplate:定义每个School项的渲染结构,模板内的DataContext是单个School实例,因此DataGrid的ItemsSource直接绑定Teachers即可AutoGenerateColumns="False":关闭自动列生成,手动定义列能避免不必要的属性列,同时自定义表头和显示顺序- 若需展示学校名称等额外信息,只需在
School类中添加对应属性,再在StackPanel内新增TextBlock绑定该属性即可
测试用ViewModel初始化示例
为快速验证效果,可在MainViewModel构造函数中添加测试数据:
public class MainViewModel { public ObservableCollection<School> Schools { get; set; } public MainViewModel() { Schools = new ObservableCollection<School> { new School { Teachers = new ObservableCollection<Teacher> { new Teacher { Name = "张三", ID = "T001", Address = "北京", Ranking = "A" }, new Teacher { Name = "李四", ID = "T002", Address = "上海", Ranking = "B" } } }, new School { Teachers = new ObservableCollection<Teacher> { new Teacher { Name = "王五", ID = "T003", Address = "广州", Ranking = "A" } } } }; } }
内容的提问来源于stack exchange,提问作者zynovij
相关产品推荐
相关产品推荐

