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

【三】ObservableCollection 与 List 的区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、核心概念简介
    • ObservableCollection
    • List
  • 二、关键差异对比
  • 三、典型使用场景
    • ObservableCollection 的适用场景
    • List 的适用场景
  • 四、在Community Toolkit MVVM中使用ObservableCollection<Data>和List<Data>
    • 场景1:动态列表(ObservableCollection)
    • 场景1:静态列表(List)
  • 总结


前言

在WPF项目中如何去选择使用ObservableCollection 与 List集合


一、核心概念简介

ObservableCollection

ObservableCollection 是 .NET 提供的可观察集合类,继承自 Collection,并实现了 INotifyCollectionChanged 和 INotifyPropertyChanged 接口。其核心特性是:当集合内容(如元素添加、删除、替换或重置)发生变更时,会主动触发事件通知订阅者

List

List 是最常用的泛型列表类,继承自 IList、ICollection 等接口。它基于动态数组实现,提供高效的随机访问和增删操作,但默认不支持集合变更通知

二、关键差异对比

特性​ObservableCollectionList
变更通知支持(通过 CollectionChanged 事件)不支持
适用场景需要数据绑定或监听集合变更的场景(如 UI 控件)后台数据处理、无需通知的高频操作场景
内存占用略高(需维护事件订阅机制)更低

三、典型使用场景

ObservableCollection 的适用场景

  • UI 数据绑定​:在 WPF、UWP 或 WinUI 中,绑定到 ListBox、DataGrid 等控件时,集合内容变更需自动同步到界面
  • 状态监控​:需要监听集合变更并触发其他逻辑(如日志记录、统计更新)

List 的适用场景

  • 后台数据处理​:如算法计算、批量数据导入导出,无需外部感知集合变更
  • 高频增删操作​:频繁添加/删除元素时(如临时缓存),避免事件通知带来的性能开销

四、在Community Toolkit MVVM中使用ObservableCollection和List

场景1:动态列表(ObservableCollection)

// ViewModel
[ObservableProperty]
private ObservableCollection<Data> _apiData1;public void AddData(Data item)
{_apiData1.Add(item); // UI自动刷新
}// XAML绑定
<ListView ItemsSource="{Binding ApiData1}"/>

效果​:向_apiData1添加/删除元素时,绑定控件自动更新

场景1:静态列表(List)

[ObservableProperty]
private List<Data> _apiData2;public void ReplaceData(List<Data> newData)
{ApiData2 = newData; // 需整个集合替换才能触发UI更新
}

局限​:若通过_apiData2.Add()修改集合,UI不会刷新,需手动调用OnPropertyChanged(nameof(ApiData2))

总结

ObservableCollection 与 List 的核心差异在于是否支持集合变更通知。前者适用于需要数据绑定或监听变更的场景(如 UI 开发),后者更适合后台数据处理或高频操作场景

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

相关文章:

  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(四)
  • (二)OpenCV——边缘增强与检测
  • 大数据在UI前端的应用创新:基于用户反馈的产品迭代优化系统
  • PPT处理控件Aspose.Slides教程:使用 C# 将 PPTX 转换为 EMF
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • TypeScript---class类型
  • 工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关
  • 猿人学js逆向比赛第一届第十九题
  • U-Net网络学习笔记(1)
  • 2025亚太中文赛项 B题疾病的预测与大数据分析保姆级教程思路分析
  • 机器学习数据集加载全攻略:从本地到网络
  • 【读代码】开源音乐分离工具Spleeter
  • 深度学习14(循环神经网络)
  • 深度学习篇---昇腾NPUCANN 工具包
  • JVM故障处理与类加载全解析
  • 数据结构自学Day5--链表知识总结
  • 大规模集群下 Prometheus 监控架构实战经验分享
  • LTR相关记录
  • 牛客周赛 Round 99
  • 【Dify(v1.x) 核心源码深入解析】mcp 模块
  • 4.丢出异常捕捉异常TryCatch C#例子
  • USB数据丢包真相:为什么log打印会导致高频USB数据丢包?
  • mysql数据库导入导出命令
  • 【Linux-云原生-笔记】系统引导修复(grub、bios、内核、系统初始化等)
  • Grok-4 发布会图文总结
  • 苹果UI 设计
  • SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS
  • Deepseek-如何从零开始开发需要专业知识的prompt
  • 8155平台SPI学习笔记
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能