【发布时间】:2016-04-22 12:19:27
【问题描述】:
我的要求是项目应该添加到 IEnumerable 集合中,并且应该在从 IEnumerable 集合中添加/删除项目时触发 Collection changed 事件。
使用反射我尝试在 IEnumarable 集合中添加新项目,我尝试了以下场景,但在 IEnumarable 集合中添加新项目时无法通知集合已更改,还有其他解决方案吗?
试过下面一个,IEnumarable 集合没有得到更新。
((IEnumerable<object>)ItemsSource).ToList().Add(NewItemsSourceAppointment);
尝试了以下一项,IEnumarable 集合已更新但未触发集合更改事件。
ItemsSource = ((IEnumerable<object>)ItemsSource).Concat(new[] { NewItemsSourceAppointment });
【问题讨论】:
-
IEnumerable没有Add方法。你不能只使用为此而设计的ObservableCollection吗? -
ItemsSource中存储了什么?如果它是使用ObservableCollection<SomeType>初始化的,则使用类型转换:((ObservableCollection<SomeType>)ItemsSource).Add(new SomeType())。 -
收藏更改通知并不是什么魔法,您可以追溯添加到您喜欢的任何内容中。
IEnumerable是一个接口,它是该接口的实现,负责添加更改通知等功能。 -
((ICollection<SomeType>)ItemsSource).Add(NewItemsSourceAppointment)应该适用于每个可修改的集合。当实际集合类型实现INotifyCollectionChanged时,将触发CollectionChanged事件。除此之外,您不应该对 ItemsControl 的ItemsSource属性进行操作(就像您似乎正在做的那样)。相反,更改源属性(即 ItemsSource 绑定到的属性)。 -
@Clemens 不,这不是真的,因为
ICollection<T>不支持协方差(它一定不支持)