ObservableCollection赋值新实例后CollectionChanged事件不触发问题
问题原因与解决方法
你的核心误区是:事件处理程序是绑定到特定的ObservableCollection实例上的,而非Effects属性本身。
具体分析
- 在
DesignItem的构造函数中,你给初始创建的_effects实例添加了CollectionChanged事件处理程序Effects_CollectionChanged。 - 当执行
di.Effects = New ObservableCollection(Of Effect) From {myGreyScaleEffect}时,你把_effects替换成了一个全新的ObservableCollection实例,但这个新实例没有注册任何CollectionChanged事件处理程序。 - 所以后续调用
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
相关产品推荐
相关产品推荐

