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。
如果喜歡我的文章,那麼
“在看”和轉發是對我最大的支援!