ListChanged绑定列表中自定义类的属性更改时的事件

时间:2013-09-24 19:40:25

标签: .net vb.net

我有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事件。

有什么想法吗?

1 个答案:

答案 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,它将为您管理事件订阅。