WPF C#如何显示对象数组内容 如何在DataGrid中展示FootballTeam数组
问题原因
WPF DataGrid默认开启自动生成列时,无法直接解析展示ICollection<TeamDate>这类集合类型的属性,只会显示集合的类型标识,也就是你截图里的(Collection)效果。
实现方案
以下是两种常用的实现方式,可根据需求选择:
方案1:日期集合拼接为字符串展示(适合轻量展示场景)
先给FootballTeam类新增一个只读的格式化属性,将日期集合转为可直接展示的字符串:
public class FootballTeam { public int Id { get; set; } public string Name { get; set; } public string Country { get; set; } public virtual ICollection<TeamDate> TeamDates { get; set; } // 新增格式化展示属性 public string FormattedTeamDates => TeamDates == null ? "无" : string.Join(";", TeamDates.Select(t => t.date.ToString("yyyy-MM-dd"))); }
然后手动定义DataGrid的列,关闭自动生成列:
<DataGrid x:Name="TeamGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="队伍ID" Binding="{Binding Id}" /> <DataGridTextColumn Header="队伍名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="所属国家" Binding="{Binding Country}" /> <DataGridTextColumn Header="关联日期" Binding="{Binding FormattedTeamDates}" /> </DataGrid.Columns> </DataGrid>
后台直接赋值数据源即可:
// footballTeamArray为你拿到的FootballTeam类型数组 TeamGrid.ItemsSource = footballTeamArray;
方案2:行详情嵌套展示日期集合(适合日期较多的分层展示场景)
不需要修改实体类,直接用DataGrid的行详情模板,选中某行时展开展示所有关联日期:
<DataGrid x:Name="TeamGrid" AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"> <DataGrid.Columns> <DataGridTextColumn Header="队伍ID" Binding="{Binding Id}" /> <DataGridTextColumn Header="队伍名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="所属国家" Binding="{Binding Country}" /> </DataGrid.Columns> <!-- 行详情模板,展示当前行对应的所有日期 --> <DataGrid.RowDetailsTemplate> <DataTemplate> <ItemsControl ItemsSource="{Binding TeamDates}" Padding="15,5"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding date, StringFormat=yyyy-MM-dd}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> </DataGrid.RowDetailsTemplate> </DataGrid>
后台赋值逻辑和方案1一致。
内容的提问来源于stack exchange,提问作者TheMadMattt
相关产品推荐
相关产品推荐

