自定义数据类型ObservableCollection绑定DataGrid后数据不显示问题咨询
问题诊断与解决方案
核心问题:字段无法被WPF数据绑定识别
WPF数据绑定机制仅支持绑定公共属性(Public Properties),你定义的ComponentDisplayData类中,Name、Resistance、Voltage、Active都是公共字段(直接用public string Name;这类语法),DataGrid无法通过字段读取数据,导致单元格为空。
修复步骤
1. 将ComponentDisplayData的字段改为属性
修改ComponentDisplayData类,把字段替换为带getter的属性(单向显示场景下getter足够,如需编辑可添加setter):
public class ComponentDisplayData { public string Name { get; } public float Resistance { get; } public float Voltage { get; } public bool Active { get; } public ComponentDisplayData(Component component) { Name = component.name; Resistance = component.Resistance; Voltage = component is Cell cell ? cell.Voltage : 0; Active = component.Active; } }
2. 优化DataGrid列的绑定(可选但推荐)
Active是bool类型,用DataGridCheckBoxColumn比DataGridTextColumn更直观,同时建议给列添加Header提升可读性:
<DataGrid x:Name="ComponentDataGrid" AutoGenerateColumns="False" IsReadOnly="False" SelectionChanged="ComponentDataGrid_SelectionChanged"> <DataGrid.Columns> <DataGridTextColumn Header="名称" Binding="{Binding Name}"/> <DataGridTextColumn Header="电阻值" Binding="{Binding Resistance}"/> <DataGridTextColumn Header="电压值" Binding="{Binding Voltage}"/> <DataGridCheckBoxColumn Header="激活状态" Binding="{Binding Active}"/> </DataGrid.Columns> </DataGrid>
3. 移除冗余的DataContext设置
窗口构造函数中同时设置DataContext和ItemsSource属于冗余操作,DataGrid只需设置ItemsSource即可:
public Workspace() { InitializeComponent(); ComponentDataGrid.ItemsSource = DataGridHandler.LoadCollectionData(); }
验证修改效果
完成以上修改后,调用DataGridHandler.AddNewComponentData(component)时,新增行将正确显示所有数据,遍历ComponentDataGrid.ItemsSource也能和界面显示保持一致。
内容的提问来源于stack exchange,提问作者Ben Fleming
相关产品推荐
相关产品推荐

