当前位置: 首页 > article >正文

ObservableCollection序列化,和监听链表内元素变化

1.ObservableCollection序列化

情景:定义了A类、B类;

A类里面有ObservableCollection<B>类型的属性,假设这个属性名称为BList;

ObservableCollection<MotionIntervalSegmentation> motionIntervalSegmentation;
[Browsable(true)]
[Display(Description = "低速区间", GroupName = "通用", Name = "低速区间", Order = 15)]
public ObservableCollection<MotionIntervalSegmentation> MotionIntervalSegmentationList
{get => motionIntervalSegmentation;set{if (value != motionIntervalSegmentation){OnPropertyChanged("MotionIntervalSegmentationList", motionIntervalSegmentation, value);motionIntervalSegmentation = value;}}
}

在调用Newtonsoft.Json库进行Json序列化时,在生成的Json字符串中发现BList里面每一个B类型实体的属性都丢了;

尝试给B类添加了Serializable和DataContract,没效果;

最后给B类的每个属性添加了DataMember特性,可以正常序列化:

private int _startPoint;
[DataMember]//必须加 *^____^*
[Browsable(true)]
[Display(Description = "区间起点", GroupName = "通用", Name = "起点", Order = 1)]
public int StartPoint
{get { return _startPoint; }set { this.RaiseAndSetIfChanged(ref _startPoint, value); }
}

添加了[DataMember]就不用给类添加[DataContract],反之不行;

2.监听ObservableCollection链表内元素变化

正常情况下,一个ObservableCollection<T> 类型的属性:

private ObservableCollection<ExposureParam> _exposureParams;
public ObservableCollection<ExposureParam> ExposureParams
{get => _exposureParams;set => this.RaiseAndSetIfChanged(ref _exposureParams, value);
}

只有当这个集合初始化、删除或者添加元素的时候才会进入Set赋值方法。

场景:界面的Datagrid绑定了后台的一个实体链表、PropertyGrid绑定的实体中有链表类型属性等,在改变链表中单个元素的属性时,想要监测改变的新值。

实现:

比如有一个字段:public ObservableCollection<ExposureParam> ExposureParams;

ObservableCollection类型有CollectionChanged事件,实现思路是监听ExposureParam类的属性变化,然后传递给ObservableCollection的CollectionChanged事件;

C#中 INotifyPropertyChanged接口可以实现监听一个类的属性变化;

然后在一个链表初始化的时候把每个元素的属性改变事件与链表的CollectionChanged事件关联起来,这里给出实现:

 public class HiddenCountCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged{/// <summary>/// 隐藏Count属性,不在属性编辑框显示/// </summary>[Browsable(false)]public new int Count => base.Count;protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e){if (e.Action == NotifyCollectionChangedAction.Add){RegisterPropertyChanged(e.NewItems);}else if (e.Action == NotifyCollectionChangedAction.Remove){UnRegisterPropertyChanged(e.OldItems);}else if (e.Action == NotifyCollectionChangedAction.Replace){UnRegisterPropertyChanged(e.OldItems);RegisterPropertyChanged(e.NewItems);}base.OnCollectionChanged(e);}protected override void ClearItems(){UnRegisterPropertyChanged(this);base.ClearItems();}private void RegisterPropertyChanged(IList items) { foreach (INotifyPropertyChanged item in items) { if (item != null) { item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);} } }private void UnRegisterPropertyChanged(IList items){ foreach (INotifyPropertyChanged item in items) {if (item != null){ item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);}} }private void item_PropertyChanged(object sender, PropertyChangedEventArgs e){//launch an event Reset with name of property changedbase.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } }

其中我重写了父类的Count属性,并且添加了[Browsable(false)]特性,就不会在属性编辑框(PropertyGrid)中显示Count一栏,遇到的话你就懂了;

引用:C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件 - dotnet编程大全的文章 - 知乎
https://zhuanlan.zhihu.com/p/453099277

http://www.lryc.cn/news/2384335.html

相关文章:

  • NLP学习路线图(四):Python编程语言
  • matlab实现无线通信组
  • 基于单片机的室内采光及可燃气体泄漏报警装置设计
  • Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
  • 从单体到分布式:深入解析Data Mesh架构及其应用场景与价值
  • AI大模型ms-swift框架实战指南(十三):Agent智能体能力构建指南
  • LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘
  • Leetcode百题斩-回溯
  • 超小多模态视觉语言模型MiniMind-V 训练
  • 边缘云的定义、实现与典型应用场景!与传统云计算的区别!
  • HarmonyOS 鸿蒙应用开发基础:父组件和子组件的通信方法总结
  • 小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下
  • Scrapy爬取heima论坛所有页面内容并保存到MySQL数据库中
  • HarmonyOS NEXT~鸿蒙系统下的Cordova框架应用开发指南
  • com.alibaba.fastjson2 和com.alibaba.fastjson 区别
  • 探索数据结构的时间与空间复杂度:编程世界的效率密码
  • std::ranges::views::stride 和 std::ranges::stride_view
  • 了解Android studio 初学者零基础推荐(2)
  • 矩阵短剧系统:如何用1个后台管理100+小程序?技术解析与实战应用
  • C# 初学者的 3 种重构模式
  • MySQL 数据类型深度全栈实战,天花板玩法层出不穷!
  • 前端vscode学习
  • 自动驾驶传感器数据处理:Python 如何让无人车更智能?
  • 从电商角度设计大模型的 Prompt
  • 利用 SQL Server 作业实现异步任务处理:一种简化系统架构的实践方案
  • 平安健康2025年一季度深耕医养,科技赋能见成效
  • Index-AniSora技术升级开源:动漫视频生成强化学习
  • LLVM编译C++测试
  • ubuntu24.04+RTX5090D 显卡驱动安装
  • MATLAB贝叶斯超参数优化LSTM预测设备寿命应用——以航空发动机退化数据为例