假设我有一个实现INotifyPropertyChanged
的类,其中一个属性是一个成员为ObservableCollections
的类:
namespace Example
{
public class A : INotifyPropertyChanged
{
private B _prop;
public B Prop
{
get { return _prop; }
set
{
_prop = value;
NotifyPropertyChanged("Prop");
}
}
public A() { Prop = new B(); }
//"Some Property" related Prop.words
}
public class B
{
public ObservableCollection<String> words { get; set; }
public B() { words = new ObservableCollection<String>(); }
}
}
我很困惑,当A
更改时,如何通知课程Prop.words
中的该属性。我在哪个类中实现INotifyCollectionChanged
的处理程序?
Prop.words
更改时更新。
答案 0 :(得分:2)
如果需要通知A类,那么您必须 仅在A类 中挂钩CollectionChanged。在Prop。的属性设定器中执行此操作。
确保取消处理程序,以防属性B被设置为新值以避免任何内存泄漏。
public class A : INotifyPropertyChanged
{
private B _prop;
public B Prop
{
get { return _prop; }
set
{
if(_prop != null)
_prop.words.CollectionChanged -= words_CollectionChanged;
_prop = value;
if (_prop != null)
_prop.words.CollectionChanged += words_CollectionChanged;
NotifyPropertyChanged("Prop");
}
}
void words_CollectionChanged(object sender,
NotifyCollectionChangedEventArgs e)
{
// Notify other properties here.
}
public A() { Prop = new B(); }
//Some Property related Prop.words
}
答案 1 :(得分:0)
A
类的客户端应该处理这个问题。
当基础馆藏发生变化时,恕我直言会提出PropertyChanged
会破坏INotifyPropertyChanged
的功能合约。
此外想象你有一个项目控件绑定到集合:每次集合更改它将完全反弹,因为我们通知它已完全改变,绝对不是你想要的!
A a = new A();
...
a.Prop.Words.CollectionChanged += ...
如果绑定到Prop
属性,这正是WPF控件的作用。
请注意,从教条的OO设计角度来看,这违反了得墨忒耳法则,所以你可以将Words集合表面变成你的A类型以避免这种情况,但这是另一个问题/辩论。