问题标签 [inotifycollectionchanged]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
2062 浏览

wpf - 为什么我的 CollectionChanged 事件处理程序没有被调用?

我已经对 stackoverflow 进行了一些研究和其他答案,表明我需要扩展 ObservableCollection 类以在添加或删除项目时向每个项目添加 PropertyChanged 事件处理程序,以便在集合中项目的内容发生变化时获取事件。 .. 真的有点烦人,但我已经根据其中一些答案实现了这个类:

据我了解,当任何一个元素触发 PropertyChanged 事件时,都会触发 CollectionChanged 事件。当我从 item_PropertyChanged 方法进入 DeeplyObservableCollection_CollectionChanged 方法时,这似乎可以工作。

因此,在我的代码中,我将事件处理程序附加到 DeeplyObservableCollection_CollectionChanged 方法,如下所示:

GroupSettingsList 是一个 DeeplyObservableCollection,而 ContentCollectionChanged 是一个 CollectionChanged 事件处理程序。我没有收到任何错误,但我的方法永远不会被调用,我不知道为什么。

我需要做什么才能在此处调用我的事件处理程序?

显示我如何使用此类的附加代码:

0 投票
1 回答
369 浏览

c# - 无法从 Collection 获取更改通知到绑定到 LINQ 查询的 UI 控件

我正在尝试使用刚刚学习的 LINQ 解决一个简单的问题。

我有一个字符串集合,在这种情况下代表串行端口,它们将显示在控件中,但必须排序。原始集合是未排序的,我不一定要修改它,或者复制它。因此,我创建了一个 IEnumerable 类型的属性并将其绑定到一个 ComboBox。

这很好用,ComboBox 具有正确顺序的正确内容。但是,如果原始集合发生更改,则 a) 当原始集合更改时,ComboBox 没有得到正确通知,或者 b) LINQ 查询没有被刷新。

在尝试了一些不同的事情之后,我看不出下面的代码是如何工作的。我肯定错过了什么。

这里可能有多余的额外代码......无论如何,源代码后面是控件的 XAML:

XAML:

0 投票
1 回答
204 浏览

silverlight - Silverlight 数据绑定到集合内的集合

希望有人可以帮助我解决这个问题。我正在创建一个用于编辑图像的 Silverlight 应用程序。用户有一个项目,其中包含包含元素的层。(元素是文本和图像元素)。

我有一个代表项目的类。它包含一个ObservableCollection<Layer>,每个层都有一个ObservableCollection<Element>. 元素是一个抽象类。有一个继承自 Element 的 TextElement 和 ImageElement 类。

我的问题是,当我更改集合中的元素时,UI 永远不会更新。我在我的所有属性上使用 INotifyPropertyChanged 并且我在集合上捕获 CollectionChanged 但仍然没有成功。CollectionChanged 事件ObservableCollection<Element>永远不会在更新其元素之一时受到影响。

这是我最初拥有的代码:

void Elements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { this.NotifyChange("Elements"); }

如果有人可以提供帮助,我将不胜感激。

0 投票
2 回答
181 浏览

c# - 为计算的属性实现 INotfyPropertyChanged

我对 MVVM 有点陌生,想知道

假设我定义了一个ObservableCollection<Differences> Diffs属性。我还有以下属性:

我不明白我应该如何实现OnPropertyChangedfor IsSame,因为它在 Diff 列表中是隐含的。

  • 我应该附加到 ListOnCollectionChanged事件然后检查它是否发生变化IsSame
  • 我是否应该使用支持字段并处理 List OnCollectionChanged

非常感谢你。

0 投票
2 回答
1094 浏览

c# - INotifyCollectionChanged 的​​ NewItems - 不能使用 OfType获取数据

我试图从CollectionChanged实现的集合事件中获取一些自定义对象INotifyCollectionChanged

我面临的问题是myItems总是说“枚举没有结果”。

展开调试e.NewItems.SyncRoot显示以下内容:

很明显,数据在那里。检索此数据的方法是什么?

0 投票
1 回答
105 浏览

silverlight - 如何将两个可观察的集合映射在一起?

我有一个有趣的问题。我有一个现有的模块,它公开和维护一个可观察的实体集合。我想要一个可观察的集合或 INotifyCollectionChanged 的​​一些实现,它与从另一个集合中添加和删除项目保持同步,但包含包装类(视图模型)而不是实体本身。

我对 CollectionChanged 事件的工作原理了解得很浅,但我想要么完全处理我不确定我知道如何做的事情,要么使用现有模式。谁能帮我这个?

0 投票
2 回答
2046 浏览

c# - 有没有办法为使用集合中“子实体”属性的计算属性触发某种“OnPropertyChanged”事件?

OnPropertyChanged有没有办法为使用集合中“子实体”属性的计算属性触发某种事件?

一个小例子:

我有一个带有显示客户属性的 DataGrid 的简单 WPF 应用程序。我正在使用 Entity Framework 5,CodeFirst 方法,所以我使用自己的 INotifyPropertyChanged 实现手动编写了我的类。

现在在同一个类中,我创建了 3 个计算属性:

FullNameDataGrid 中自动更新,因为我正在调用OnPropertyChanged("FullName");

我找到了一个 INotifyCollectionChanged 实现的示例,我可能可以使用它来自动更新TotalCars在 ICollection 中添加或删除某些内容时:http: //www.dotnetfunda.com/articles/article886-change-notification-for-objects-和-collections.aspx

但是,当ICollection ( ) 中OnPropertyChange("TotalOpenInvoices")的属性 ( ) 发生变化时触发的最佳方法是什么?PayedInFullInvoices

在 Invoice 类中做类似的事情OnPropertyChanged("Customer.TotalOpenInvoices");似乎并不能解决问题...... :)

0 投票
1 回答
1004 浏览

inotifycollectionchanged - ObservableCollection 的 CollectionChanged 事件未触发

我有一个XamDataGrid绑定到可观察集合的。由于XamDataGrid是可编辑的,因此可以添加/编辑/删除记录。我已经实施了CollectionChanged&PropertyChanged事件。

CollectionChanged事件包含以下代码:

所有这些工作正常。

我有一个奇怪的问题,如下所示。

当我在网格中添加一条记录并从网格中删除它时,我通过遍历集合从集合中删除该项目

例如:PhoneDetailsCollection.Remove(item);

现在,当我添加另一条记录时,该CollectionChanged事件不会被触发。

我在这里错过了什么吗?任何帮助都非常感谢...

0 投票
1 回答
665 浏览

c# - 向 WPF Datagrid 添加大量项目会消耗大量 CPU 时间

我正在创建具有一些简单嗅探器功能并显示用户转储数据包的应用程序。从转储文件中读取数据包,该文件会根据当前流量实时更新,然后将捕获的数据包添加到 Datagrid(每个数据包都是新行)。我使用数据绑定从实现 ICollectionChanged 接口的转储读取器获取数据包,因此 Datagrid 在每个新数据包上都会收到通知。Datagrid 使用虚拟化和延迟滚动。几乎一切正常 - 唯一的例外是巨大的 CPU 消耗。这种 CPU 使用率是由于我读取所有新数据包(每秒数千个)、格式化它们以供显示和每个数据包上升 CollectionChanged 事件,这会更新 Datagrid。对软件的要求是用户不必实时查看所有新数据包——它们每秒出现数十万个,所以没有人会注意到他们。用户只能查看某些数据包,当他想要时,他可以向下/向上滚动条到适当的位置以查看他想要的数据包,并且只有在这种情况下必须从文件中读取数据包。

问题是我希望Datagrid每秒更新一次以显示新数据包到达,最好通过将滚动条缩放到实际数据包数量,但不需要连续读取它们,格式化并调用CollectionChanged,因为它需要CPU时间,此外如果他不滚动条,用户将看不到新数据包。我被告知到达的数据包数量,因此我知道所有数据包的数量。

我试图添加假数据包(从而避免读取和格式化每个新数据包)只是为了强制 Datagrid 扩展到实际数据包计数。它几乎起作用了,因为 CPU 使用率下降并且当我滚动条时数据包只读。但是过了一会儿,当新的数据包被添加到Datagrid时,当前视图中的行开始随机重复,即在第一时刻视图中的数据包显示第1、第2、第3、第4、第5、第6等等,但是过了一会儿它们分别显示为第 1、第 2、第 3 和第 1、第 2、第 3。

我还尝试刷新绑定 - 它有效,但消耗的资源比第一种方法更多,所以我放弃了它。我还尝试刷新 Datagrid 的 listcollectionview - 与刷新绑定的效果相同。

接下来是当我想在一次调用 CollectionChanged 时添加数据包列表

我收到了 PresentationFramework.dll!System.Windows.Data.ListCollectionView.ValidateCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 引发的 Range 操作不受支持的错误

所以我不得不为数据包列表中的每个数据包调用 CollectionChanged,这也增加了 CPU 使用率。

综上所述,我想通知 Datagrid 有新的数据包/行,因此 Datagrid 滚动条将缩放到数据包的总数,但只有当用户滚动条时才会从文件中读取数据包。

对于如何解决我的问题的每一个建议,我都会非常感谢。

我刚刚意识到,有一件重要的事情要提,很抱歉我一开始就忘了说。我的 ObservableCollection 支持某种数据虚拟化,在内存中我只保存一些必要的数据包。当新数据包到达时,我只通知我的集合新数据包的数量,我不必调用集合的 Add 方法,因为我实际上没有向它添加任何数据包 - 所以实际上没有数据包被读取. Collection 包含关于那一刻数据包总数的信息,并且只有少量实际保存在内存中,以便网格可以显示它们。仅在必要时动态读取数据包,当它们不显示时,它们被释放。但是要通知网格有关新数据包的信息,我必须(我不知道如何做另一种更好的方法)调用 CollectionChanged 并且在此调用的参数中我需要提供每个新数据包。而这个对 CollectionChanged 的​​调用使得数据包被实际读取,这会消耗 CPU。我想重新调整网格,以便滚动条大小通知新数据包到达,但无需读取数据包并在每个新数据包调用 CollectionChanged (每秒可能发生数千次). 我希望仅在滚动条位置发生变化时读取数据包,因此处理每个数据包的昂贵操作将仅针对少数当前可见的数据包完成,而不是针对每个数据包。

0 投票
1 回答
2013 浏览

c# - ObservableCollection 逐元素变换/投影包装器

在 WPF 中创建 ViewModel 时,有时需要将ObservableCollection(源集合)中可用的数据转换为扩展/限制/投影原始元素(目标集合)的包装元素集合,而元素的数量和顺序始终反映原始收藏。

就像Select扩展方法一样,只是它不断更新,因此可以用于 WPF 绑定。

如果在索引 x 处将元素添加到源,则在目标集合中的相同索引 x 处添加相同元素的 Wrapper。如果在源集合中删除索引 y 处的元素,则在目标集合中删除索引 y 处的元素。

假设有一个ObservableCollection<ClassA>,但我需要绑定的是一个ReadOnlyObservableCollection<ClassB>(或等效的),其中ClassB->ClassA如下:

我可以写我自己的TemplatedTransformCollectionWrapper,我可以写这个:

TemplatedTransformCollectionWrapper 理想地包装了所有实现INotifyCollectionChanged并正确处理原始、包装的集合的所有可能的添加、删除、替换操作的集合。

写对了也不是小事,TemplatedTransformCollectionWrapper似乎是别人已经做过的事情,甚至可能是核心框架的一部分。但我找不到它。