2012-04-20 35 views
6

我感到困惑如何ObservableCollectionINotifyPropertyChanged作品。ObservableCollection和INotifyPropertyChanged有什么区别?

我有这样的代码:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments); 

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

我不明白什么是ObservableCollectionINotifyPropertyChanged这里的关系。你可以解释吗?

回答

6

ObservableCollection是一个专门的集合,可以通知用户时,其内容变化,而INotifyPropertyChanged是一个接口,允许实现者通知用户,当他们属性之一变化值。

你可能想知道两者是如何关联(因为两者都是在二传手在你的榜样“参与”)。

考虑以下代码:

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。因此,制定者利用INotifyPropertyChanged告诉订户该集合已被替换为另一个,并且他们当然应该更新其状态。

结论:自动的在WPF数据绑定的工作方式,因为所有的数据绑定控件听取他们的DataContextINotifyPropertyChanged如果绑定目标实现,他们订阅的还有INotifyCollectionChanged。如果绑定目标发生变化,则通过INotifyPropertyChanged通知他们,退订旧目标上的INotifyCollectionChanged,并在新目标上订阅。

2

一个ObservableCollection通知其粘结剂,利用例如补上一时/删除对集合本身。

但是,您在第二个示例中正在做的事是通知绑定器集合已被新集合所取代(ObservableCollection本身不执行的事情,如果您执行新的ObservableCollection - 那么您将失去绑定)。

+0

我也明白你的答案。你也给出了很好的答案。谢谢。 – pratikjgandhi 2012-04-20 13:50:39