ObservableCollection和INotifyPropertyChanged有什么区别?

时间:2012-04-20 13:06:57

标签: wpf mvvm

我对ObservableCollectionINotifyPropertyChanged的工作原理感到困惑。

我有这段代码:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments);

public ObservableCollection<PaymentViewModel> Payments
{
    get { return _payments; }
    set {
        _payments = value;
        RaisePropertyChanged("Payments");
    }
}

我不明白这里ObservableCollectionINotifyPropertyChanged之间的关系是什么。你能解释一下吗?

2 个答案:

答案 0 :(得分:8)

ObservableCollection是一个专门的集合,可以在其内容更改时通知订阅者,而INotifyPropertyChanged是一个允许实现者在其中一个时通知订阅者的接口属性会改变价值。

你可能想知道这两者是如何相关的(因为两者都是&#34;涉及&#34;在你的例子中的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绑定到此集合,我们希望它自行更新并反映model.Payments最终为空的事实。但它怎么能这样做呢?

CollectionChanged无济于事,因为原始集合(收到第一个项目后)未被修改;我们只是丢弃它并在其位置安装了另一个。唯一知道切换发生的是Payments属性设置器。因此,setter利用INotifyPropertyChanged告诉订阅者该集合已被其他集合替换,他们当然应该更新其状态。

结论:数据绑定在WPF中自动运行,因为所有数据绑定控件都会侦听INotifyPropertyChangedDataContext目标实现INotifyCollectionChanged他们也订阅了它。如果绑定目标发生更改,则会通过INotifyPropertyChanged通知他们,取消订阅旧目标上的INotifyCollectionChanged并在新目标上订阅。

答案 1 :(得分:2)

ObservableCollection通知其绑定器,例如在向集合本身添加/删除某些内容时。

然而,您在第二个示例中所做的是通知绑定器集合已被新集合替换(ObservableCollection不自行执行此操作,如果执行新的ObservableCollection,则会丢失绑定)