ObservableCollection全面解析

本文僅作為參考大佬們文章的總結。

ObservableCollection是C#中一個功能強大的動態數據集合類,特別適用于需要數據綁定和UI自動更新的場景。本文將系統性地總結ObservableCollection的核心概念、使用方法、性能優化策略以及在實際項目中的應用實踐。

一、ObservableCollection基礎概念

1. 定義與特性

ObservableCollection<T>是System.Collections.ObjectModel命名空間下的一個泛型集合類,它繼承自Collection<T>并實現了INotifyCollectionChanged和INotifyPropertyChanged接口。其核心特性包括:

  • ??自動變更通知??:當集合中的元素被添加、移除或整個列表被重置時,會自動觸發CollectionChanged事件

  • ??UI同步更新??:特別適用于WPF、UWP等需要數據綁定的框架,能夠確保UI元素實時反映數據變化

  • ??動態數據管理??:提供標準的集合操作方法如Add、Remove、Insert等

2. 與普通List的區別

ObservableCollection與普通List的主要區別在于變更通知機制:

特性

ObservableCollection

List

變更通知

支持(INotifyCollectionChanged)

不支持

UI自動更新

適用場景

數據綁定/UI更新

后臺數據處理

內存占用

略高(需維護事件機制)

更低

線程安全性

需通過Dispatcher調用

需手動同步

3. 核心應用場景

ObservableCollection特別適用于以下場景:

  1. ??WPF/UWP數據綁定??:與ListBox、DataGrid等控件綁定,實現數據-UI自動同步

  2. ??實時監控系統??:如聊天應用消息列表、股票行情顯示等需要實時更新的界面

  3. ??MVVM架構??:作為ViewModel中的集合屬性,連接Model和View

  4. ??配置管理系統??:需要動態反映配置變化的場景

二、基本使用方法

1. 初始化與基本操作

使用ObservableCollection首先需要引用System.Collections.ObjectModel命名空間:

using System.Collections.ObjectModel;// 初始化
var collection = new ObservableCollection<string>();// 添加元素
collection.Add("Item1");
collection.Add("Item2");// 移除元素
collection.Remove("Item1");// 插入元素
collection.Insert(0, "NewItem");

2. 數據綁定示例

在WPF中,ObservableCollection可以輕松實現數據綁定:

<!-- XAML中定義ListBox綁定 -->
<ListBox ItemsSource="{Binding Items}" DisplayMemberPath="Name"/>
// ViewModel中定義集合屬性
public class MainViewModel
{public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>();public MainViewModel(){// 初始化數據Items.Add(new Item { Name = "Item1" });Items.Add(new Item { Name = "Item2" });}
}

當通過Add、Remove等方法修改集合時,UI會自動更新,無需手動刷新。

3. 監聽集合變更

可以通過CollectionChanged事件監聽集合變化:

collection.CollectionChanged += (sender, e) =>
{Console.WriteLine($"變更類型: {e.Action}");if (e.NewItems != null){Console.WriteLine($"新增項數: {e.NewItems.Count}");}if (e.OldItems != null){Console.WriteLine($"移除項數: {e.OldItems.Count}");}
};

事件參數NotifyCollectionChangedEventArgs包含以下重要屬性:

  • ??Action??:變更類型(Add、Remove、Replace、Move、Reset)

  • ??NewItems??:新增項的集合

  • ??OldItems??:移除項的集合

  • ??NewStartingIndex??:新增項的起始索引

  • ??OldStartingIndex??:移除項的起始索引

三、高級應用技巧

1. 批量操作優化

標準ObservableCollection在進行批量操作時會對每個操作單獨觸發事件,可能導致性能問題。解決方案是使用ObservableRangeCollection:

// 使用MvvmCross中的ObservableRangeCollection
var rangeCollection = new ObservableRangeCollection<int>();
var itemsToAdd = Enumerable.Range(1, 1000).ToArray();// 批量添加,只觸發一次事件
rangeCollection.AddRange(itemsToAdd);

ObservableRangeCollection提供了以下批量操作方法:

  • AddRange:批量添加

  • RemoveRange:批量移除

  • ReplaceRange:批量替換

2. 與INotifyPropertyChanged結合

當集合中的元素屬性變化時,也需要通知UI更新。這需要元素類實現INotifyPropertyChanged接口:

public class Person : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set{_name = value;OnPropertyChanged(nameof(Name));}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

這樣,當Person對象的Name屬性變化時,綁定的UI也會相應更新。

3. 跨線程訪問處理

ObservableCollection不是線程安全的,在非UI線程修改集合會導致異常。解決方案是通過Dispatcher或SynchronizationContext:

// WPF中使用Dispatcher
Application.Current.Dispatcher.Invoke(() =>
{collection.Add(newItem);
});// 使用SynchronizationContext
SynchronizationContext uiContext = SynchronizationContext.Current;
uiContext.Post(_ => 
{collection.Remove(oldItem);
}, null);

4. 集合視圖與篩選排序

可以通過CollectionViewSource對ObservableCollection進行篩選和排序:

var cvs = new CollectionViewSource { Source = collection };
cvs.View.Filter = item => ((Person)item).Age > 18; // 篩選成年人
cvs.View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));// 綁定到View
listBox.ItemsSource = cvs.View;

四、性能優化

1. 性能考量

雖然ObservableCollection提供了便利的變更通知,但在某些場景下需要注意性能問題:

  1. ??批量操作??:頻繁的單元素操作會導致多次事件觸發,應盡量使用批量方法

  2. ??大型集合??:對于包含數千項的大型集合,應考慮分頁或虛擬化技術

  3. ??復雜UI??:復雜控件(如DataGrid)綁定大型集合時可能性能下降

2. 使用建議

根據實際場景選擇合適的集合類型:

  • ??需要UI自動更新??:使用ObservableCollection

  • ??純數據處理/高頻操作??:使用List

  • ??需要批量操作??:使用ObservableRangeCollection或自定義擴展方法

3. 擴展方法示例

可以為ObservableCollection添加自定義擴展方法提高便利性:

public static class ObservableCollectionExtensions
{public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items){foreach (var item in items){collection.Add(item);}}public static void ReplaceAll<T>(this ObservableCollection<T> collection, IEnumerable<T> items){collection.Clear();foreach (var item in items){collection.Add(item);}}
}

五、應用案例

1. 學生管理系統

使用ObservableCollection實現學生信息的增刪改查:

public class StudentManager
{public ObservableCollection<Student> Students { get; } = new ObservableCollection<Student>();// 添加學生public void AddStudent(Student student){Students.Add(student);}// 刪除學生public void RemoveStudent(int studentId){var student = Students.FirstOrDefault(s => s.Id == studentId);if (student != null){Students.Remove(student);}}// 更新學生信息public void UpdateStudent(Student updatedStudent){var index = Students.IndexOf(Students.First(s => s.Id == updatedStudent.Id));if (index >= 0){Students[index] = updatedStudent;}}
}

2. 實時數據監控

構建實時監控系統,顯示不斷更新的數據:

public class DataMonitorViewModel
{public ObservableCollection<DataPoint> DataPoints { get; }= new ObservableCollection<DataPoint>();private Timer _updateTimer;public DataMonitorViewModel(){// 定時更新數據_updateTimer = new Timer(UpdateData, null, 0, 1000);}private void UpdateData(object state){var newData = GetLatestDataFromService();// 確保在UI線程更新Application.Current.Dispatcher.Invoke(() =>{DataPoints.Clear();foreach (var data in newData){DataPoints.Add(data);}});}
}

六、常見問題與解決方案

  1. ??UI不更新問題??

    • 確保綁定的屬性是public且可讀

    • 檢查是否實現了INotifyPropertyChanged

    • 確認數據上下文(DataContext)設置正確

  2. ??線程訪問沖突??

    • 確保在UI線程修改集合

    • 使用Dispatcher或SynchronizationContext跨線程調用

  3. ??性能問題??

    • 對于大型集合,考慮使用虛擬化面板(VirtualizingPanel)

    • 避免頻繁的單元素操作,改用批量方法

  4. ??內存泄漏??

    • 及時取消事件訂閱

    • 避免長期持有集合引用

參考:

  1. 【三】ObservableCollection 與 List 的區別
  2. list和ObservableCollection的區別
  3. C#將每個無線局域網配置文件存儲在ObservableCollection中
  4. C# WPF入門學習主線篇(二十八)—— 使用集合(ObservableCollection)
  5. C#中的ObservableCollection及其數據綁定中的作用
  6. C#中的 ObservableCollection 、ObservableRangeCollection
  7. 動態數據集合ObservableCollection的使用
  8. C#集合類ObservableCollection與List的區別和使用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91514.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

佰力博檢測與您探討超高溫介電測試的應用領域

超高溫介電測試是指在極端高溫條件下&#xff08;通常高于1000℃&#xff09;對材料的介電性能進行測量和分析的過程。以評估材料在高溫環境下的電學性能穩定性&#xff0c;如介電常數、介電損耗、阻抗譜等參數。超高溫介電測試需要用到的超高溫介電阻抗測試設備&#xff1a;UT…

OneCode自治UI核心組件Layout布局介紹:構建靈活高效的界面布局系統

在現代前端開發中&#xff0c;布局系統扮演著至關重要的角色&#xff0c;它不僅決定了界面的結構美感&#xff0c;更直接影響用戶體驗和開發效率。OneCode作為一款企業級低代碼開發平臺&#xff0c;其布局引擎通過精巧的設計實現了簡潔API與強大功能的完美平衡。本文將深入剖析…

為何“白名單媒體”是性價比之選?

在信息媒體空前發展的今天&#xff0c;軟文營銷已成為企業品牌推廣的重要手段之一。然而&#xff0c;面對眾多媒體&#xff0c;如何選擇高性價比的發稿媒體成為許多營銷人員的一個課題。其中&#xff0c;“白名單媒體”憑借其高收錄率、權威背書等優勢&#xff0c;逐漸成為軟文…

Python 異步編程之 async 和 await

基礎知識 在 Python 中&#xff0c;async 和 await 是用于異步編程的關鍵字&#xff0c;引入了異步/協程&#xff08;coroutine&#xff09;的概念。核心思想是通過 協程&#xff08;Coroutine&#xff09; 和 事件循環&#xff08;Event Loop&#xff09; 實現非阻塞并發&…

關于接口測試的HTTP基礎【接口測試】

HTTP 協議基礎知識總結&#xff08;用于 Web API 接口測試&#xff09;接口測試中最常用的通訊協議就是 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff0c;本節旨在幫助理解 HTTP 協議的結構、工作流程以及如何用于接口測試。一、HTTP 協議簡介HTTP 是一種…

STM32 DMA通信詳解

STM32 DMA通信詳解DMA(Direct Memory Access&#xff0c;直接內存訪問)是STM32微控制器中一種重要的數據傳輸機制&#xff0c;它允許外設與內存之間或內存與內存之間直接傳輸數據&#xff0c;而無需CPU的干預。這種機制可以顯著提高系統性能&#xff0c;特別是在需要高速數據傳…

pytest--1--pytest-mock常用的方法

1. mocker.patch mocker.patch 是最常用的方法&#xff0c;用于替換指定的對象或方法。它可以用于模擬函數、方法、類或模塊。 語法 mocker.patch(target, newDEFAULT, specNone, createFalse, spec_setNone, autospecNone, new_callableNone, **kwargs)示例 import pytest fro…

尚庭公寓----------分頁查詢

根據條件分頁查詢公寓列表 進行分頁配置 package com.nie.lease.common.mybatisplus;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.in…

【圖像質量評價指標】圖像熵(Image Entropy) —— 熵值飽和現象

文章目錄一、圖像熵&#xff08;Image Entropy&#xff09;&#xff08;1&#xff09;基本原理&#xff08;2&#xff09;優勢與局限&#xff08;3&#xff09;推薦策略多指標聯合推薦體系噪聲應對機制建議二、項目實戰 —— 通過圖像熵評價序列圖像&#xff0c;并提取最優圖像…

GaussDB in的用法

1 in的作用in運算符允許您在WHERE子句中指定多個值。 in運算符是多個OR條件的簡寫。2 in的語法select column_name(s) from table_name where column_name in (value1, value2, ...); 或者 select column_name(s) from table_name where column_name in (select statement);3 i…

【C語言進階】內存函數

目錄 1.memcpy函數 1.1 模擬實現 2.memmove函數 3.memcmp函數 1.memcpy函數 字符串拷貝strcpy和strncpy是有一定局限性的&#xff0c;只能拷貝字符串&#xff0c;而memcpy可以拷貝任意類型的數據&#xff0c;單位是字節。 1.1 模擬實現 #include<stdio.h> #include&l…

從亂序到整潔:Swift 實現奇偶鏈表重排的最佳方案

文章目錄摘要描述題解答案題解代碼分析分段講解示例測試及結果時間復雜度空間復雜度總結摘要 在開發中&#xff0c;鏈表結構經常出現在緩存淘汰、操作系統任務調度、或是 LRU 算法中&#xff0c;尤其是對節點位置的靈活操作更是鏈表的強項。LeetCode 第 328 題「奇偶鏈表」就給…

WPF+CEF 執行JS報錯

WPFCEF 執行JS報錯 在WPF中執行 webBrowser.EvaluateScriptAsync(“window.scrollBy(0, 1000);”); 在部分網站會報異常&#xff1a; Request BrowserId : XXXX not found it’s likely the browser is already closed環境 .Net Framework 4.7 CefSharp.Wpf 131.3.50 解決方案&…

【Python3-Django】快速掌握DRF:ModelViewSet實戰指南

DRF講解 1. 什么是 Django 和 Django REST Framework&#xff1f; 在深入 ModelViewSet 之前&#xff0c;我們先簡單了解一下背景知識&#xff1a; Django 是一個基于 Python 的 Web 開發框架&#xff0c;旨在幫助開發者快速構建安全、可擴展的 Web 應用。它遵循“不要重復自己…

TRAE IDE** 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南

以下是一份完整的 TRAE IDE 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南。整個過程基于 TRAE 作為 AI 輔助編程工具的特性&#xff08;對標 Cursor/AWS Kiro&#xff09;&#xff0c;假設它支持智能代碼生成和云部署功能。 【插播】騰訊云AI Coding大賽https://mar…

重學前端005 --- 響應式網頁設計 CSS 盒子模型

文章目錄BOX 盒子概念CSSoverflow: hidden;filter: blur(3px);box-shadow: 0 0 3px 3px #efb762;border-radius: 30px 25px 60px 12px;transform: rotate(-0.6deg);每個 HTML 元素都是一個盒子&#xff0c;它擁有著自己的間距和邊框。這叫作“盒子模型”。 BOX 盒子概念 內容…

TC500R立式加工中心主軸箱機械結構設計cad【11張】三維圖+設計說明書

TC500R立式加工中心主軸箱機械結構設計 摘 要 數控機床作為工業制造的基礎&#xff0c;在國家的發展中起著非常重要的作用。隨著我國經濟的快速發展&#xff0c;我國已經成為工業制造大國&#xff0c;制造業的發展離不開數控機床&#xff0c;而TC500R立式加工中心作為數控機床…

CSS Grid布局:構建現代網頁的強大網格系統

目錄 一、Grid布局基礎概念 1.1 網格容器與網格項 1.2 創建基本網格 二、核心屬性詳解 2.1 定義網格軌道 2.2 網格間距控制 2.3 網格項對齊方式 三、實戰布局技巧 3.1 創建經典布局 3.2 網格項定位技巧 3.3 響應式網格設計 四、Grid布局 vs Flexbox布局 五、高級…

Elasticsearch / MongoDB / Redis / MySQL 區別

1、一句話簡介名稱核心用途Elasticsearch強大的全文檢索與日志分析引擎MongoDB靈活的文檔數據庫&#xff0c;適合半結構化/結構化數據Redis高性能的內存鍵值緩存數據庫&#xff0c;用于實時高并發處理MySQL經典關系型數據庫&#xff0c;強事務支持&#xff0c;結構化數據持久存…

網絡通信之基礎知識

一、什么是計算機網絡&#xff1f;計算機網絡是指由若干主機、通信鏈路和網絡設備&#xff08;如路由器、交換機等&#xff09;組成的系統&#xff0c;借助通信協議&#xff0c;實現信息共享和資源互聯。其本質是&#xff1a;多臺設備之間通過協議進行數據交換。二、網絡協議與…