我对 ObservableCollection
和 INotifyPropertyChanged
的工作方式感到困惑。
我有这个代码:
Payments = new ObservableCollection<PaymentViewModel>(_allPayments);
public ObservableCollection<PaymentViewModel> Payments
{
get { return _payments; }
set {
_payments = value;
RaisePropertyChanged("Payments");
}
}
我不明白这里的
ObservableCollection
和 INotifyPropertyChanged
是什么关系。你可以解释吗? 最佳答案
ObservableCollection
是一个专门的集合,可以在其内容更改时通知订阅者,而 INotifyPropertyChanged
是一个接口(interface),允许实现者在其属性之一更改值时通知订阅者。
您可能想知道这两者是如何相关的(因为在您的示例中,两者都“参与”了 setter)。
考虑这个代码:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel());
INotifyCollectionChanged.CollectionChanged
事件的订阅者现在知道事情发生了变化,他们应该相应地更新。但现在看看这个:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel()); // OK, we know what this does
model.Payments = new ObservableCollection<PaymentViewModel>();
将项目添加到集合后,我们将整个集合交换为另一个集合。如果
ItemsControl
绑定(bind)到这个集合,我们希望它自己更新并反射(reflect) model.Payments
最终为空的事实。但它怎么能这样做呢?CollectionChanged
无济于事,因为原始集合(在收到第一项之后)没有被修改;我们只是丢弃了它并在其位置安装了另一个。唯一知道切换发生的是 Payments
属性 setter 。因此 setter 使用 INotifyPropertyChanged
告诉订阅者该集合已被另一个替换,他们当然应该更新他们的状态。结论: 数据绑定(bind)在 WPF 中自动工作,因为所有数据绑定(bind)控件都监听其
INotifyPropertyChanged
的 DataContext
,如果绑定(bind)目标实现 INotifyCollectionChanged
,它们也会订阅该代码。如果绑定(bind)目标发生变化,他们会通过 INotifyPropertyChanged
得到通知,在旧目标上取消订阅 INotifyCollectionChanged
并在新目标上订阅它。关于wpf - ObservableCollection 和 INotifyPropertyChanged 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10246859/