You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义数据类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:37:56