我很困惑如何ObservableCollection和INotifyPropertyChanged作品.
我有这个代码:
Payments = new ObservableCollection<PaymentViewModel>(_allPayments);
public ObservableCollection<PaymentViewModel> Payments
{
get { return _payments; }
set {
_payments = value;
RaisePropertyChanged("Payments");
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白这里ObservableCollection和INotifyPropertyChanged这里的关系是什么.你可以解释吗?
ObservableCollection是一个专门的集合,可以在内容更改时通知订阅者,同时INotifyPropertyChanged是一个接口,允许实现者在其中一个属性更改值时通知订阅者.
您可能想知道这两者是如何相关的(因为两者都是"参与"您示例中的setter).
考虑以下代码:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel());
Run Code Online (Sandbox Code Playgroud)
该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>();
Run Code Online (Sandbox Code Playgroud)
在将一个项目添加到集合之后,我们将整个集合交换为另一个集合.如果a ItemsControl绑定到此集合,我们希望它自我更新并反映model.Payments最终为空的事实.但它怎么能这样做呢?
CollectionChanged没有帮助,因为原始集合(在收到第一个项目后)没有被修改; 我们只是丢弃它并在其位置安装了另一个.知道转换发生的唯一一个是Payments属性设置器.因此,setter INotifyPropertyChanged用于告诉订阅者该集合已被另一个集合替换,他们当然应该更新它们的状态.
结论:数据自动地结合作品在WPF,因为所有的数据绑定控件听INotifyPropertyChanged他们的DataContext,而如果在绑定目标实现INotifyCollectionChanged,他们订阅的为好.如果绑定目标发生更改,则会通知他们INotifyPropertyChanged,取消订阅INotifyCollectionChanged旧目标并在新目标上订阅.
| 归档时间: |
|
| 查看次数: |
2285 次 |
| 最近记录: |