1

我有 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 中添加/删除项目)则不会引发。

我还在 OtherClass 和 AnotherClass 中抛出 PropertyChanged 事件。

任何想法?

4

1 回答 1

1

不幸的是,您的 Foo 类没有自动连接来知道 OtherClass 何时更改,除非 Foo 通过使用事件处理程序订阅它来专门侦听 OtherClass 的 PropertyChanged 事件。在该事件处理程序中,您将在 Foo 本身上触发属性更改事件,说明其 OtherClass 属性已更改。

这可能有点棘手,因为如果该属性使用某种 getter/setter 公开,那么您需要在对象更改时取消订阅并重新订阅该对象。

对于您的另一个类的 BindingList,它有点不同,因为 BindingList 没有实现 INotifyPropertyChanged。它实现了具有 ListChanged 事件的 IBindingList。所以你必须订阅它。

只要 AnotherClass 实现了 INotifyPropertyChanged,那么绑定列表就应该将其更改的事件抛出给 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,它将为您管理事件订阅。

于 2013-09-24T20:41:07.163 回答