• WPF中的集合变更通知
  • 发布于 2个月前
  • 319 热度
    0 评论
WPF中的集合变更通知是指当集合中的元素发生改变时,WPF能够自动感知这些变化,并向UI界面发送通知进行更新。常见的集合变更通知有INotifyCollectionChanged接口和ObservableCollection类。
1. INotifyCollectionChanged接口
INotifyCollectionChanged接口是WPF中集合变更通知的基本接口,它定义了一个CollectionChanged事件,用于通知界面集合的变化。如果我们使用自己实现的集合类,可以实现INotifyCollectionChanged接口,并在集合的Add、Remove、Clear等方法中触发CollectionChanged事件。
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类,我们可以方便地在界面上实现集合变更通知。
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]等注解来标记需要注入的接口。
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。
用户评论