You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ObservableCollection赋值新实例后CollectionChanged事件不触发问题

问题原因与解决方法

你的核心误区是:事件处理程序是绑定到特定的ObservableCollection实例上的,而非Effects属性本身。

具体分析

  1. 在DesignItem的构造函数中,你给初始创建的_effects实例添加了CollectionChanged事件处理程序Effects_CollectionChanged。
  2. 当执行di.Effects = New ObservableCollection(Of Effect) From {myGreyScaleEffect}时,你把_effects替换成了一个全新的ObservableCollection实例,但这个新实例没有注册任何CollectionChanged事件处理程序。
  3. 所以后续调用di.Effects.Add(myDropShadowEffect)时,新集合的CollectionChanged事件没有对应的处理方法,自然不会触发Effects_CollectionChanged。

修正代码

你需要在Effects属性的Setter中,先移除旧集合的事件绑定(避免内存泄漏),再给新集合添加事件处理:

Public Property Effects() As ObservableCollection(Of Effect)
    Get
        Return _effects
    End Get
    Set(ByVal value As ObservableCollection(Of Effect))
        ' 移除旧集合的事件绑定
        If _effects IsNot Nothing Then
            RemoveHandler _effects.CollectionChanged, AddressOf Effects_CollectionChanged
        End If
        _effects = value
        ' 给新集合添加事件绑定
        If _effects IsNot Nothing Then
            AddHandler _effects.CollectionChanged, AddressOf Effects_CollectionChanged
        End If
        If Effects?.Count >= 1 Then ApplyEffects()
    End Set
End Property

这样无论你是直接修改初始集合,还是替换成新的集合,CollectionChanged事件都会正确触发Effects_CollectionChanged方法。

内容的提问来源于stack exchange,提问作者stigzler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:23