WinUI 3.0 ListView分组表头正常但列表项仅显示类名如何解决
问题根因
分组表头正常显示说明分组排序逻辑、CollectionViewSource配置均无问题,列表项显示项目名.类名格式字符串,是因为未配置ListView的ItemTemplate(列表项数据模板):ListView不知道如何解析渲染Contact实例的属性,默认会调用对象的ToString()方法,直接输出类型的全限定名。
修复方案
在ListView中新增ItemTemplate配置,明确指定每个Contact对象要绑定展示的属性和对应布局即可。
修改后的完整XAML代码
<!-- 注意先在页面头部引入Contact类所在命名空间,例如: xmlns:local="using:TestApp" 和你引入GroupInfoList的xmlns:local1写法规则一致 --> <ListView ItemsSource="{x:Bind ContactsCVS.View, Mode=OneWay}"> <CollectionViewSource x:Name="ContactsCVS" IsSourceGrouped="True"/> <ListView.ItemsPanel> <ItemsPanelTemplate> <ItemsStackPanel AreStickyGroupHeadersEnabled="False"/> </ItemsPanelTemplate> </ListView.ItemsPanel> <!-- 新增:列表项渲染模板 --> <ListView.ItemTemplate> <DataTemplate x:DataType="local:Contact"> <!-- 可根据需求调整布局,以下为参考示例的双行文本布局 --> <StackPanel Spacing="4" Padding="12,8"> <TextBlock Text="{x:Bind Name}" Style="{ThemeResource BodyStrongTextBlockStyle}"/> <TextBlock Text="{x:Bind Company}" Style="{ThemeResource CaptionTextBlockStyle}" Opacity="0.6"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> <ListView.GroupStyle> <GroupStyle > <GroupStyle.HeaderTemplate> <DataTemplate x:DataType="local1:GroupInfoList"> <Border AutomationProperties.Name="{x:Bind Key}" Padding="12,8,12,4"> <TextBlock Text="{x:Bind Key}" Style="{ThemeResource TitleTextBlockStyle}"/> </Border> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ListView.GroupStyle> </ListView>
注意事项
- 代码中
x:DataType="local:Contact"的命名空间别名local,要替换为你项目页面对应的实际命名空间引入别名,保证编译时可正确识别Contact类型。 - DataTemplate内的布局可自由调整,比如添加头像控件、更多联系人信息字段,直接绑定Contact类的对应属性即可。
可选简易方案(不推荐)
如果仅需要纯文本展示,不需要自定义样式布局,也可以直接重写Contact类的ToString()方法:
public class Contact { // 原有属性、构造函数保留 public override string ToString() { return $"{Name} | {Company}"; } }
该方案灵活性极差,无法实现多控件排版、差异化字体样式等效果,仅适合极简场景临时使用。
内容的提问来源于stack exchange,提问作者Ricky Kresslein
相关产品推荐
相关产品推荐

