在WPF(Windows Presentation Foundation)中,
ObservableCollection<T>
是一个非常重要的类,它用于实现动态数据绑定功能。
这个类位于
System.Collections.ObjectModel
命名空间中,是
ICollection<T>
,
IList<T>
,
IEnumerable<T>
,
INotifyCollecti
onChanged
, 和
INotifyPropertyChanged
接口的实现。以下是关于
ObservableCollection<T>
的一些关键点:
-
动态数据集合
:
ObservableCollection<T>
设计用于当集合的内容发生变化时自动通知UI
。这意味着当你向集合中添加、删除元素或修改集合时,所有绑定到这个集合的UI元素都会自动更新以反映这些变化。
-
数据绑定
: 它是数据绑定的理想选择,特别是
在需要实时反映数据变化的场景,如列表、网格视图等。你可以直接将它绑定到如
ListBox
,
ListView
,
TreeView
等UI控件的
ItemsSource
属性上。
-
通知接口
: 实现了
INotifyCollectionChanged
接口,通过触发
CollectionChanged
事件来通知监听者集合已发生更改。同时,由于它也实现了
INotifyPropertyChanged
,所以对于集合本身属性的变化(如重新排序)也能通知UI。
-
线程注意事项
:
虽然
ObservableCollection<T>
功能强大,但它不是线程安全的。在多线程环境中,直接从非UI线程修改它会导致异常。为了在后台线程更新并安全地通知UI线程,你需要使用如
Dispatcher
,
BindingOperations.EnableCollectionSynchronization
, 或其他线程安全策略。
-
性能考虑
: 因为每次集合变更都会触发表单更新,所以在大量数据操作时需要注意性能影响。适时使用
NotifyCollectionChangedAction.Reset
而不是逐个通知,或者在合适的时候批量更新,可以提高效率。
-
使用场景
: 通常用于MVVM(Model-View-ViewModel)架构中ViewModel层,作为ViewModel属性来存储并管理那些需要在View上展示并响应变化的数据集合。
记住,如果你需要集合内的对象属性变更也能触发UI更新,那么这些对象也应该实现
INotifyPropertyChanged
接口。这样,当对象的某个属性值改变时,UI上绑定到该属性的地方也会得到更新。
在进行
WPF
开发过程中,需要从一个新的线程中操作
ObservableCollection
,结果程序抛出一个NotSupportedException的错误
public class Async
ObservableCollection
:
ObservableCollection
//获取当前线程的SynchronizationContext
对象
private Synchro
WPF
提供
ObservableCollection
类,该类是实现INotifyCollectionChanged接口的数据收集的内置实现。
public class
ObservableCollection
: Collection, INotifyCollectionChanged, INotifyPropertyChanged