0

我已经编写了 1 个 WPF 应用程序。一个非常简单的应用程序。它工作得很好,今天被大量用作 LOB 应用程序。现在,我将开始对旧的 VB6 应用程序进行重大重写,并将其变成 WPF 应用程序。在开发第一个应用程序时,我了解了 INotifyPropertyChanged 接口,以及它对 WPF/Silverlight 数据绑定的重要性。现在,我担心的是,很久以前我为旧的 VB6 应用程序编写了一个 WCF 服务,该服务旨在替换我多年前在 VB6 中编写的旧中间层组件。我编写的 WCF 服务返回 ADO.NET 数据集,因为老实说,我多年来一直在使用这些数据集并且对它们感到满意。但是,现在我开始开发这个新应用程序,我非常关心我的 WCF 服务,因为 ADO.NET 数据集没有

所以我开始看其他的东西。现在我在看实体框架。我正在使用 Julia Lerman 的书《编程实体框架:第二版》,它看起来很有前途。我已经完成了她的 WPF 应用程序示例,该应用程序使用了她在前一章中编写的 EDM 程序集。包括对程序集的引用给了我 CollectionViewSource,至少在我看来,它们的行为方式与 INotifyPropertyChanged 接口的行为方式大致相同。

所以我的问题是:CollectionViewSource 类是否实现了 INotifyPropertyChanged 接口?我试过查看 MSDN 文档,但它并没有直接这么说,但我想知道 DependencyObject 类 CollectionViewSource 是否继承自与 INotifyPropertyChanged 接口相同的功能,还是 CollectionViewSource 实现了它?

4

2 回答 2

1

您会注意到 CollectionViewSource 上的 MSDN 文档包含此作为类声明:

Public Class CollectionViewSource _
    Inherits DependencyObject _
    Implements ISupportInitialize, IWeakEventListener

它和它的基类都没有实现 INotifyPropertyChanged。当你绑定到ViewCollectionViewSource 的时候,你必须在底层集合发生变化时自己调用它的Refresh()方法。如果您更改 CVS 的属性(例如排序和分组),则会自动调用 Refresh。

于 2011-03-22T21:31:40.860 回答
1

只是提到罗德回答的一个小细节:

在向集合中添加或删除项目时,项目会经过任何过滤器、分组、排序等。

但是,当现有项目的属性发生更改时,您必须自己处理以更新过滤器、分组等。

此时,Refresh() 的解决方案有效,但是由于整个集合都被刷新,会带来非常糟糕的用户体验。

一种解决方案是模拟项目的移除/插入。有关详细信息,请参阅我的帖子。

于 2011-04-13T17:04:59.293 回答