可观察集合ObservableCollection
using System;
using System.Collections.ObjectModel;
class Program
{
static void Main()
{
// 创建一个可观察集合
ObservableCollection<string> list = new ObservableCollection<string>();
// 注册集合变化事件
list.CollectionChanged += (sender, e) =>
{
Console.WriteLine($"Action: {e.Action}");
// 处理新增项
if (e.NewItems != null)
{
foreach (var item in e.NewItems)
{
Console.WriteLine($"Added: {item}");
}
}
// 处理删除项
if (e.OldItems != null)
{
foreach (var item in e.OldItems)
{
Console.WriteLine($"Removed: {item}");
}
}
};
// 添加元素
list.Add("Hello");
list.Add("World");
list.Remove("Hell"); // 删除不存在的元素,不会触发事件
//list.Remove("Hello"); // 删除存在的元素,会触发事件
// 删除元素
// 注意:删除时索引会随着元素的移除而改变
// 先删除 "World"(索引 1),再删除 "Hello"(索引 0)
list.RemoveAt(1); // 删除索引为 1 的元素("World")
list.RemoveAt(0); // 删除索引为 0 的元素("Hello")
// 其他删除方式(可选)
// 先删除 "Hello",再删除 "World"
// list.RemoveAt(0);
// list.RemoveAt(0);
// 清空集合
// 注意:Clear 方法会触发 CollectionChanged 事件,但不会触发 NewItems 和 OldItems 的变化
list.Clear();
}
}
在现代的软件开发中,尤其是在构建动态用户界面(如 WPF、UWP 或 Xamarin)时,数据绑定是一个核心概念。它允许开发者将数据源与界面元素绑定,从而实现数据的自动更新和同步。在 .NET 中,ObservableCollection<T>
是一个专门为这种场景设计的集合类,它提供了动态通知功能,使得集合的变化能够实时反映到绑定的用户界面上。
什么是 ObservableCollection
?
ObservableCollection<T>
是一个位于 System.Collections.ObjectModel
命名空间下的动态数据集合。它继承自 Collection<T>
,并实现了 INotifyCollectionChanged
和 INotifyPropertyChanged
接口。这意味着当集合中的数据发生变化(如添加、删除或修改元素)时,它会自动通知绑定的界面元素,从而触发界面的更新。
这种特性使得 ObservableCollection
成为实现数据绑定的理想选择,尤其是在需要实时更新用户界面的场景中。
核心功能与特性
1. 动态通知
ObservableCollection
的核心功能之一是它能够动态通知外部(如绑定的 UI 元素)集合的变化。这种通知通过 CollectionChanged
事件实现,每当集合中的数据发生变化时,该事件会被触发。事件参数 NotifyCollectionChangedEventArgs
提供了关于变化的详细信息,例如:
-
Action
:表示操作类型(如添加、删除、替换等)。 -
NewItems
:表示新增的项。 -
OldItems
:表示被删除的项。
2. 支持数据绑定
ObservableCollection
是专为数据绑定设计的集合类型。在 WPF 和 UWP 中,它可以与各种控件(如 ListBox
、ComboBox
、DataGrid
等)无缝配合,使得开发者能够轻松实现动态数据的展示和更新。
3. 线程安全问题
需要注意的是,ObservableCollection
默认情况下不是线程安全的。如果需要在多线程环境中使用,需要额外的同步处理。
输出结果
运行上述代码后,控制台输出如下:
Action: Add
Added: Hello
Action: Add
Added: World
Action: Remove
Removed: World
Action: Remove
Removed: Hello
Action: Reset
代码解析
-
创建集合
创建了一个ObservableCollection<string>
实例,用于存储字符串数据。 -
注册事件监听
通过CollectionChanged
事件监听集合的变化。事件处理器会根据操作类型(Action
)和变化的项(NewItems
和OldItems
)输出相关信息。 -
添加和删除元素
-
使用
Add
方法添加元素。 -
使用
Remove
方法尝试删除一个不存在的元素(不会触发事件)。 -
使用
RemoveAt
方法按索引删除元素。 -
使用
Clear
方法清空整个集合(会触发Reset
事件)。
-