WPF中DataGrid组合框列无法填充每行对应球员列表的问题解决
WPF DataGrid 组合框列空白问题修复
根因定位
现在的组合框列完全没数据,本质是对DataGridComboBoxColumn的属性绑定用错了:
TextBinding是用来绑定列当前选中值对应的展示文本的,根本不是给组合框设下拉数据源的属性。原代码直接把它绑到List<StartingEleven>类型的HomeTeam11球员集合上,类型完全不匹配,WPF没法把一个集合转成单元格要显示的单段文本,自然出空白。- 全程没给组合框设下拉选项源、没指定要展示的对象字段,系统既不知道下拉项从哪来,也不知道拿到球员对象后该显示哪个内容。
可直接套用的修复代码
- 先处理重复加载的老问题
原方法每次触发都会往DataGrid里追加新列、追加新行,反复调用会导致列越来越多、数据重复叠加,每次加载前先清干净:// 清空原有列和数据,避免重复叠加 dg.Columns.Clear(); dg.Items.Clear(); - 替换原来写崩的组合框列定义
把原来的c9列逻辑换成正确的绑定配置:System.Windows.Controls.DataGridComboBoxColumn c9 = new System.Windows.Controls.DataGridComboBoxColumn(); c9.Header = "Team 11"; // 把当前行的HomeTeam11球员列表,直接作为该行组合框的下拉选项源 c9.ItemsSourceBinding = new System.Windows.Data.Binding("HomeTeam11"); // 告诉组合框,下拉项要显示StartingEleven的name字段(球员姓名) c9.DisplayMemberPath = "name"; // 绑定选中值的文本展示 c9.SelectedValueBinding = new System.Windows.Data.Binding("name"); c9.Width = 160; // 适当加宽,别把球员名字挤没了 dg.Columns.Add(c9);
几个容易踩的坑
- 别把
TextBinding和ItemsSourceBinding搞混:前者只负责编辑模式关闭时的文本渲染,后者才是给组合框喂下拉选项的核心,搞反了永远出不来数据。 DisplayMemberPath一定要配,不然组合框拿到StartingEleven对象后,会直接输出类的全名称(类似YourNamespace.StartingEleven),根本看不到球员名字。- 如果后续要动态修改首发名单,记得给
DGObject加上INotifyPropertyChanged接口实现,保证属性改了UI能跟着刷新;如果只是一次性加载完就不动了,现在的普通POCO定义完全够用。
内容的提问来源于stack exchange,提问作者krešimir šumiga
相关产品推荐
相关产品推荐

