【三】ObservableCollection 与 List 的区别

文章目录


前言

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


一、核心概念简介

ObservableCollection

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

List

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

二、关键差异对比

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

三、典型使用场景

ObservableCollection 的适用场景

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

List 的适用场景

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

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

场景1:动态列表(ObservableCollection)

csharp 复制代码
// ViewModel
[ObservableProperty]
private ObservableCollection<Data> _apiData1;

public void AddData(Data item)
{
    _apiData1.Add(item); // UI自动刷新
}

// XAML绑定
<ListView ItemsSource="{Binding ApiData1}"/>

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

场景1:静态列表(List)

csharp 复制代码
[ObservableProperty]
private List<Data> _apiData2;

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

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

总结

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