【问题标题】:To notify collection changed while adding item to IEnumerable collection在将项目添加到 IEnumerable 集合时通知集合已更改
【发布时间】: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&lt;SomeType&gt; 初始化的,则使用类型转换:((ObservableCollection&lt;SomeType&gt;)ItemsSource).Add(new SomeType())
  • 收藏更改通知并不是什么魔法,您可以追溯添加到您喜欢的任何内容中。 IEnumerable 是一个接口,它是该接口的实现,负责添加更改通知等功能。
  • ((ICollection&lt;SomeType&gt;)ItemsSource).Add(NewItemsSourceAppointment) 应该适用于每个可修改的集合。当实际集合类型实现INotifyCollectionChanged 时,将触发CollectionChanged 事件。除此之外,您不应该对 ItemsControl 的 ItemsSource 属性进行操作(就像您似乎正在做的那样)。相反,更改源属性(即 ItemsSource 绑定到的属性)。
  • @Clemens 不,这不是真的,因为ICollection&lt;T&gt; 不支持协方差(它一定不支持)

标签: c# wpf xaml


【解决方案1】:

您正在向新创建的列表中添加一个元素。 List&lt;T&gt; 不会将任何新添加的元素转发到任何其他集合,因此您必须将元素添加到原始集合中。

有两种可能性,要么你知道你的对象的类型,要么你不知道。

如果这样做,请将您的 IEnumerable 转换为 ICollection&lt;ElementType&gt; 并使用 Add 方法。

((ICollection<T>)ItemsSource).Add(NewItemsSourceAppointment)

如果您不这样做,则该集合很有可能仍然实现非泛型 IList 接口。您可以投射到那里并在那里调用 Add。

((IList)ItemsSource).Add(NewItemsSourceAppointment)

对于大多数集合接口,后者很好。

但是,也有可能上述方法都不起作用,即您的 ItemsSource 集合是只读的,例如 Select 调用的结果。

编辑:这会将您的元素添加到集合中。集合是否会触发集合更改事件取决于集合实现。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2020-11-05
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多