WPF中的集合变更通知是指当集合中的元素发生改变时,WPF能够自动感知这些变化,并向UI界面发送通知进行更新。常见的集合变更通知有INotifyCollectionChanged接口和ObservableCollection类。
1. INotifyCollectionChanged接口
INotifyCollectionChanged接口是WPF中集合变更通知的基本接口,它定义了一个CollectionChanged事件,用于通知界面集合的变化。如果我们使用自己实现的集合类,可以实现INotifyCollectionChanged接口,并在集合的Add、Remove、Clear等方法中触发CollectionChanged事件。
```csharp public class MyCollection<T> : IEnumerable<T>, INotifyCollectionChanged { private List<T> list = new List<T>(); public void Add(T item) { list.Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); } //... public event NotifyCollectionChangedEventHandler CollectionChanged; protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { CollectionChanged?.Invoke(this, e); } } ```
在上面的代码中,我们自己实现了一个MyCollection类,并实现了INotifyCollectionChanged接口。在集合的Add方法中,我们触发了CollectionChanged事件,并传入一个NotifyCollectionChangedEventArgs对象,表示集合的Add操作。
2. ObservableCollection类
ObservableCollection类是WPF中提供的一个具体的集合类,它实现了INotifyCollectionChanged接口和IEnumerable接口,并提供了一系列集合操作方法。使用ObservableCollection类,我们可以方便地在界面上实现集合变更通知。
```csharp public class MyViewModel : INotifyPropertyChanged { private ObservableCollection<string> items = new ObservableCollection<string>(); public ObservableCollection<string> Items { get { return items; } set { items = value; OnPropertyChanged(nameof(Items)); } } //... public void AddItem(string item) { Items.Add(item); } //... } ```
在上面的代码中,我们在ViewModel中使用了一个ObservableCollection对象,并提供了AddItem方法向集合中添加新元素。当集合中的元素发生变化时,WPF会自动感知这些变化,并向UI界面发送通知进行更新。
3. Fody
Fody是一个.NET应用程序编织器,可以通过自动化注入代码来增强.NET程序的功能。在WPF中,Fody可以用于自动实现INotifyPropertyChanged接口和INotifyCollectionChanged接口。
在使用Fody时,我们需要在项目中安装Fody和PropertyChanged.Fody等相关NuGet包,并在ViewModel类中使用[AddINotifyPropertyChangedInterface]和[AddINotifyCollectionChangedInterface]等注解来标记需要注入的接口。
```csharp using PropertyChanged; [AddINotifyPropertyChangedInterface] [AddINotifyCollectionChangedInterface] public class MyViewModel { public ObservableCollection<string> Items { get; set; } = new ObservableCollection<string>(); //... } ```
在上面的代码中,我们在ViewModel类中使用了[AddINotifyPropertyChangedInterface]和[AddINotifyCollectionChangedInterface]注解,来自动实现INotifyPropertyChanged接口和INotifyCollectionChanged接口。这样,在ViewModel中的属性和集合发生变化时,WPF会自动感知这些变化,并向UI界面发送通知进行更新。
需要注意的是,使用Fody注入代码会影响程序的可读性和可维护性,因此应该根据实际情况选择是否使用Fody。
如果喜欢我的文章,那么
“在看”和转发是对我最大的支持!