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绑定系统无法正确识别子类属性:
Equipment类用new关键字重定义data属性,隐藏了基类DrupalObject的data属性。EquipmentData继承自DrupalData,后者已有DrupalAttributes类型的attributes属性;前者又定义了同名的EquipmentAttributes类型attributes属性,同样隐藏了基类属性。- 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
相关产品推荐
相关产品推荐

