我有BindingList(BindingList(of Foo))和这个样本类的几个对象:
Class Foo
Implements INotifyPropertyChanged
Private _name As String
Private _numer As Integer
Private _otherClass As OtherClass
Private _bindingListOfAnotherClass As BindingList (of AnotherClass)
End Class
现在,我希望在此bindingList中项目的任何属性发生更改时获得通知。
正如你所看到的,我实现了接口,我也在抛出事件。对于基本属性抛出ListChanged事件,但是如果OtherClass或AnotherClass中的属性发生更改(或者如果在_bindingListOfAnotherclass中添加/删除了某个项),则抛出ListChanged事件。
我也在OtherClass和AnotherClass中抛出PropertyChanged事件。
有什么想法吗?
答案 0 :(得分:1)
不幸的是,你的Foo类没有自动连接知道何时更改OtherClass,除非Foo通过使用事件处理程序订阅它来专门侦听OtherClass的PropertyChanged事件。在该事件处理程序中,您将在Foo上触发一个属性更改事件,表示其OtherClass属性已更改。
这可能有点棘手,因为如果使用某种getter / setter公开该属性,那么您需要在对象发生更改时取消订阅并重新订阅。
对于AnotherClass的BindingList,它有点不同,因为BindingList没有实现INotifyPropertyChanged。它实现了具有ListChanged事件的IBindingList。所以你必须订阅它。
只要AnotherClass实现了INotifyPropertyChanged,那么绑定列表应该将其更改的事件抛给Foo,Foo又可以抛出自己的PropertyChanged事件。
修改强>
这里通常是我如何处理可以改变我希望总是订阅事件的属性:
private Object _myObject;
public Object MyObject
{
get
{
return _myObject;
}
set
{
if (_myObject != value)
{
if (_myObject != null)
_myObject.PropertyChanged -= MyDelegate;
_myObject = value;
if (_myObject != null)
_myObject.PropertyChanged += MyDelegate;
}
}
}
通过这种方式,您可以安全地将其从null设置为值并再次返回null,它将为您管理事件订阅。