wpf - ObservableCollection 和 INotifyPropertyChanged 有什么区别?

标签 wpf mvvm

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

我有这个代码:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments);

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

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

最佳答案

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

您可能想知道这两者是如何相关的(因为在您的示例中,两者都“参与”了 setter )。

考虑这段代码:

var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel());

INotifyCollectionChanged.CollectionChanged 的订阅者event 现在知道事情发生了变化,它们应该相应地更新。

但现在看看这个:
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/

相关文章:

c# - MVVM:如何对控件进行函数调用?

c# - 我的 ViewModel 是否具有 Model 的属性和单独的属性?

c# - 从代码隐藏格式化 DataGridTextColumn

c# - wpf mvvm 中的 Datagrid SelectedIndex 在 RaisePropertyChanged 上设置为 0

swift - 使用泛型将额外的 props 注入(inject)到 View 模型中

c# - 如何进行简单的数据绑定(bind)

c# - 如何为 Prism 7 应用创建 Spec-Flow 测试?

wpf - MVVM 和 VM 集合

WPF 验证 : How to validate the whole page

c# - WPF - 自动刷新组合框内容