问题标签 [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.
wpf - 如何监听 CollectionChanged 事件并执行一些方法
我的视图模型有两个集合,一个是MainCollection
,另一个是DerivedCollection
。它们使用控件显示,因此当用户与鼠标交互时,可以从 中添加或删除项目MainCollection
,并且DerivedCollection
应该相应地刷新。
第一部分(更新MainCollection
)通过数据绑定自动发生,但我不知道如何将RefreshDerivedCollection
方法挂钩到MainCollection.PropertyChanged
事件。
集合和方法都存在于同一个视图模型中。
c# - CollectionChanged 和 IList of Items - 为什么会遇到困难
我正在研究为什么在使用 IList 的参数调用 CollectionChanged 时ObservableCollection/ListCollectionView/CollectionView
引发NotSuportedException的主题。
我找到了几个网页,谈论这个话题,他们建议使用Reset
强制重新绘制 UI 的能力,或者只是简单地调用每个项目CollectionChanged
或更创造性的方式: http: //geekswithblogs.net/NewThingsILearned/存档/2008/01/16/listcollectionviewcollectionview-doesnt-support-notifycollectionchanged-with-multiple-items.aspx
我只是找不到为什么?对我来说,为什么会这样是没有意义的。
我们在开发周期中的某个时刻都面临着这个缺少的功能,因为当您想快速添加多个项目时,Add 方法需要很大的开销,是否有可能随时实现(.Net 5 , C# 6...)。
编辑:
在我的具体情况下,我编写了自己的课程:
并且仍然抛出上述NotSupportedException。
c# - DataGridView 和 INotifyCollectionChanged
我的想法是,如果我在自定义集合上实现 INotifyCollectionChanged,DataGridView 将订阅 CollectionChanged 事件。
我的 Collection 实现了 IListSource 和 INotifyCollectionChanged,并且有一个内部 BindingList。我从 BindingList 订阅 ListChanged 事件并调用我的 OnCollectionChanged 方法,然后引发 CollectionChanged 事件。
也许有更好的方法来完成上述任务,我很高兴听到它。但是,我目前主要关心的是在调用此排序方法后让 DataGridView 更新:
我是否误以为 DataGridView 订阅了 CollectionChanged 事件,或者我做错了什么?
c# - Custom IEnumerable as ItemsSource for ListBox
I have a class that defines a custom GetEnumerator() function(by implementing IEnumerable<>). I use it to iterate in a contiguous manner over several ObservableCollection<LogEvent>
that are in every TestStep. I have a private ObservableCollection<TestStep>
that contains all the needed data.
I would like to use an instance of this class as the ItemsSource of a ListBox. However, the ListBox never gets updated when the underlying data(ObservableCollection<LogEvent>
) is updated. Here's a sample of that class:
I'm not sure if I should/can implement INotifyCollectionChanged here. How can I know if ObservableCollection has been modified?
My question is: how can I get the ListBox to display the changes happening in LogEvents(which is of type ObservableCollection<LogEvent>
)?
c# - 如何在 wpf 用户控件中收听 INotifyCollectionChanged
我有一个用户控件。在那里我想维护一个集合作为依赖属性。假设该属性绑定到一个实现INotifyCollectionChanged
.
现在假设集合被添加或删除了一些项目,我如何才能在用户控件中收听该更改。
c# - C# 字典更改通知 (INotifyCollectionChanged)
我有一个循环运行检索实时股价。我想要做的是检查检索到的任何价格是否与我已经存储在字典中的价格不同,并通知我所有已更改的价格的详细信息。正在查看使用 INotifyCollectionChanged 的字典。
例如
主程序调用 Add/Update 作为测试。但是,当循环通过 NotifyCollectionChangedEventArgs 时,我必须嵌套循环并强制转换为 IEnumerable - 这似乎是一个非常冗长的方法。
我想我的问题有两个方面:- A:这是使用应通报字典的最佳方式吗?B:我应该使用上面的嵌套循环来检索更新的值吗?
提前致谢
c# - INotifyCollectionChanged 在数据绑定方面有什么意义(C# WinRt)
背景:我试图通过实现 IEnumerable、INotifyPropertyChanged 和 INotifyCollectionChanged 来推出我自己的 observable 集合。它工作正常,但是当我进行数据绑定时,CollectionChanged 事件始终为空。然而,数据绑定属性确实更新了,因为我正在发送 Items[] 属性更改事件。所以这让我想知道 INotifyCollectionChanged 在数据绑定方面的意义是什么,因为在我的课程中它永远不会被触发,但数据绑定仍然有效(它更新了对集合的所有绑定)。
然后我决定做更多的挖掘,并反编译 ObservableCollection。当我将数据绑定到 ObservableCollection 时,CollectionChanged 事件不像我的实现那样为空。
所以我真的想知道为什么 ObservableCollection 得到“特殊”处理,以及 INotifyCollectionChange 在数据绑定中扮演什么角色(如果有的话)
wpf - CollectionChanged 上的 WPF DataGrid 更新失败
我已将 DataGrid 绑定到 TEntity 类型的 ObservableCollection。该集合包含实体框架实体。
当数据库中的此类实体发生更改时,应用程序会收到通知。如果这是一个简单的替换更改,我只需覆盖 ObservableCollection 中的实体。
但是,这不会触发 UI 刷新。我认为问题在于它仍然是我所指的同一个对象。该实体现在与 UI 显示的内容肯定不同(我在 DbContext 上重新加载),因为某些列已更改。
当我这样做时
什么都没发生。集合正确触发 CollectionChanged 事件,但 UI 不会更新任何内容。
然后我尝试了这个:
现在 UI 更新,但集合当然会触发 2 个 CollectionChanged 事件。
我想一种选择是为已更改实体的所有属性触发 PropertyChanged 事件,但这似乎有点矫枉过正(事件太多),到目前为止我不需要在我的 EF 类上实现该事件。
我的问题:如果行已更改但对象仍然相同(尽管对象内的属性已更改),我如何可靠地更新 WPF 绑定的 ObservableCollection?
c# - C# 赋值的正确模式,对象的属性是集合
我有一个将不同类型的集合公开为属性的类,例如List<Address>
和SortedSet<string>
。我理解集合类应该是只读的,我们不应该公开一个集合进行更新,比如person.Address[3].City = "MyTown"
,或person.EmailAddresses.Add("foo@bar.tld")
。我正在寻找一个 C# 模式来支持这一点。
我的要求有点独特,因为我的类(如本例中的 Person)实现了INotifyPropertyChanged
. 因此,当对这些集合进行更改时,我想在容器对象(人)上触发一个事件以通知客户端应用程序。我知道我们可以使用ObservableCollection<T>,并且SortedSet
有类似这样的示例以及维护排序存储的派生类的示例。我试图避免为使用此 Person 类的其他开发人员在我的项目中添加自定义类 - 我宁愿只公开 CLR 类以减少客户端应用程序操作其他结构的需要,但这不是必需的.
排序存储问题的大多数解决方案是“不存储排序数据,让客户端视图来做”,但这将排序的通用功能留给了使用此类的开发人员,每个人都花时间创建自己的实现采用不同的技术(WPF 组件、LINQ 等)。在此示例中,Person
该类包装了另一个更原始的类,例如,我的SortedSet<string> Email
属性将具有一个创建EMAIL[]
数组的 setter。当序列化该数组时,需要为遗留目的进行排序,并且在对基类型进行排序时,我想公开一个排序的泛型集合。
我还读到你不应该在集合的内容发生变化时引发 PropertyChanged 事件。好吧,在这种情况下,客户端应用程序确实需要知道何时对该对象进行任何类型的更改,并且关于为什么不应该这样做的论点与我们实际需要它的现实不符。
总之,我正在寻找一种一致的 C# 设计模式来修改封装在容器对象中的集合,其中可以对集合进行排序,其中集合元素可能是值类型或引用类型,以及使用此对象的客户端应用程序的位置必须接收所有更改的更改通知。
在这一点上,我倾向于完全用方法来做这件事,为这个Person
类为所有集合类型创建一个一致的 API,以获取整个集合对象,也许作为一个强类型类而不是一个通用 CLR 集合,将实例属性替换为这样一个对象,设置元素并清除它。但我真的宁愿用普通的 getter/setter 来完成所有这些工作。
c# - (真)ObservableCollection不更新用户界面
我有一个类型的对象列表Emblem
,我在LongListMultiSelector
. 我只想展示那些尚未实现的。我可以选择一个或多个项目并将它们更改为,IsAchieved = true
但问题是它们不会立即消失,UI 不会自动更新。
我认为这不会是一个问题,因为我使用了ObservableCollection<T>
. 然后我发现如果一个项目的属性发生变化,集合是不会通知的。结果实现了INotifyPropertyChanged
接口,但这也不起作用。
在这里,我发现了以下与此问题相同的问题(以及更多问题):
- 当 Item 改变时通知 ObservableCollection
- ObservableCollection 没有注意到其中的项目何时更改(即使使用 INotifyPropertyChanged)
- 如何检测我的 ObservableCollection 中的项目是否已更改
我也尝试实现了的用法,TrulyObservableCollection<T>
但也没有结果。这就是我所拥有的
XAML 控制:
项目通过以下方式绑定EmblemsViewModel
:
Emblem
课程如下:
我错过了什么/做错了什么,阻止了它的工作?
更新:
我已应用 aCollectionViewSource
来应用过滤,但现在没有显示任何项目。
XAML: