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

UWP项目DataGrid绑定Equipment数组遇XAML绑定失败问题

问题描述

我正在开发一个C# UWP项目,尝试将应用中的数据源dr_equipment绑定到DataGrid。此前功能正常,但修改了dr_equipment对应的Equipment数据类型的JSON结构后,出现数据绑定错误:DataGrid显示正确列,但所有行都是空的。

错误提示显示EquipmentData对象上不存在“attributes”属性,但检查类定义后确认存在公共的attributes属性,绑定却无法识别。

补充背景:

  • XAML代码自上次正常运行后未修改,仅调整了数据结构。
  • 未使用独立ViewModel,数据存储在页面代码后置的Equipment对象中(Equipment.data[i].attributes存储绑定所需的各类属性)。
  • 已确认dr_equipment.data[]已填充(数组大小约1800),且每个.data.attributes都已正确填充数据,推测问题不在JSON序列化/反序列化,而是类本身的问题。

绑定错误信息

Error: BindingExpression path error: 'attributes' property not found on 'myProject.Classes.User_Data.Objects.EquipmentData'. 
BindingExpression: Path='data.attributes.status' DataItem='myProject.Classes.User_Data.Objects.EquipmentData'; target element is 'Windows.UI.Xaml.Controls.CheckBox' (Name='null'); target property is 'IsChecked' (type 'Boolean')

XAML代码

<controls:DataGrid
    x:Name="dataGrid"
    x:FieldModifier="Public"
    AutoGenerateColumns="False"
    ItemsSource="{x:Bind Mode=OneWay, Path=dr_equipment.data}">
    <controls:DataGrid.Columns>
        <controls:DataGridCheckBoxColumn
            Width="40"
            Binding="{Binding attributes.status}"
            CanUserReorder="False"
            CanUserResize="False"
            CanUserSort="False"
            Header=""
            IsReadOnly="False" />
    </controls:DataGrid.Columns>
</controls:DataGrid>

Equipment相关类定义

// 继承DrupalObject是因为它包含这类Drupal对象通用的基础数据
// Equipment扩展了额外的属性(都会序列化为Equipment.data.attributes)

public class Equipment : DrupalObject
{
    public new EquipmentData[] data
    {
        get; set;
    }
    public Equipment()
    {

    }
}

public class EquipmentData : DrupalData
{
    public EquipmentAttributes attributes
    {
        get; set;
    }
}

public class EquipmentAttributes : DrupalAttributes
{
    public int drupal_internal__nid
    {
        get; set;
    }
    public string title
    {
        get; set;
    }
    public bool status
    {
        get; set;
    }
}

DrupalObject相关类定义

public class DrupalObject
{
    public DrupalData[] data { get; set; }

    public DrupalObject()
    {

    }
}

public class DrupalData
{
    public string type { get; set; }
    public string id { get; set; }
    public DrupalAttributes attributes { get; set; }
}

public class DrupalAttributes
{
    public int drupal_internal__tid
    {
        get; set;
    }
    public bool status
    {
        get; set;
    }
    public string name
    {
        get; set;
    }
    public object description
    {
        get; set;
    }
    public DateTime created
    {
        get; set;
    }
    public DateTime changed 
    { 
        get; set;
    }
}
问题分析与解决

问题原因

核心问题是**属性隐藏(Hiding)**导致XAML绑定系统无法正确识别子类属性:

  1. Equipment类用new关键字重定义data属性,隐藏了基类DrupalObject的data属性。
  2. EquipmentData继承自DrupalData,后者已有DrupalAttributes类型的attributes属性;前者又定义了同名的EquipmentAttributes类型attributes属性,同样隐藏了基类属性。
  3. XAML绑定解析时优先识别基类属性定义,而非子类中被隐藏的属性,因此找不到正确的EquipmentAttributes类型attributes。

解决办法

方案1:用重写(Override)替代属性隐藏

修改基类属性为virtual,子类用override重定义,让绑定系统正确识别子类属性:

  • 修改DrupalObject:
    public class DrupalObject
    {
        public virtual DrupalData[] data { get; set; }
        // 其他代码保持不变
    }
    
  • 修改Equipment:
    public class Equipment : DrupalObject
    {
        public override EquipmentData[] data { get; set; }
        // 其他代码保持不变
    }
    
  • 修改DrupalData:
    public class DrupalData
    {
        // 其他代码保持不变
        public virtual DrupalAttributes attributes { get; set; }
    }
    
  • 修改EquipmentData:
    public class EquipmentData : DrupalData
    {
        public override EquipmentAttributes attributes { get; set; }
        // 其他代码保持不变
    }
    

方案2:避免属性同名

给EquipmentData的属性换个唯一名称,再修改XAML绑定路径:

  • 修改EquipmentData:
    public class EquipmentData : DrupalData
    {
        public EquipmentAttributes equipmentAttributes { get; set; }
    }
    
  • 修改XAML绑定:
    Binding="{Binding equipmentAttributes.status}"
    

方案3:确保序列化生成正确的子类实例

检查序列化配置(比如Newtonsoft.Json的TypeNameHandling),确保反序列化时生成EquipmentData而非DrupalData实例,避免绑定到基类属性。


内容的提问来源于stack exchange,提问作者Mark L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:40:36