INotifyPropertyChanged和BindingList的ListChanged事件

3
如果我有一个像下面这样的类:
public class MyClass : INotifyPropertyChanged
{
    private BindingList<String> myList;

    public BindingList<String> MyList
    {
        get { return myList; }
        set
        {
            if (myList == value) return;
            myList = value;
            OnPropertyChanged("MyList");
        }
    }
}

我需要设置以下事件处理程序吗:

myList.ListChanged += (object sender, ListChangedEventArgs e) => OnPropertyChanged("MyList");

还是说已经检测到了?我知道BindingList类会查找其所属的模板类型上是否存在INotifyPropertyChanged接口,以确定是否应触发ListChanged事件,但我不确定它是否也有反向功能。

2个回答

2
您的myList字段被封装在您的类中——它所做的任何事情都不会自动"冒泡"出来。绑定到类实例的东西不会知道myList中的更改,除非您使用诸如您编写的事件处理程序之类的东西将它们传播出去。但是,绑定到MyList属性的东西正在获取对BindingList对象的直接引用,因此它们将看到由myList引发的通知。

谢谢您的澄清。我确实怀疑,但还是想确认一下。正如您所说,BindingList将向绑定到它的任何内容引发任何事件,但如果我需要它来处理其他事情,我将实现该处理程序。 - Adam Goss

1

INotifyPropertyChange接口用于在类内部属性更改时进行通知。若要在集合项更改时通知,则必须使用INotifyCollectionChanged


我的理解是INotifyCollectionChanged是用于集合类而不是拥有集合的类。因此,这就是为什么我选择使用INotifyPropertyChanged的原因。 - Adam Goss
不,我的意思是你的 BindingList 类必须是 ICollectionChanged,如果你想在属性(集合)的项目更改(添加/删除)时得到通知,INotifyPropertyChanged 就不起作用了。 - Raúl Otaño

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接