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

为何我的ObservableCollection无PropertyChanged事件?修改后仍未触发

解决ObservableCollection中对象属性变更不触发PropertyChanged的问题

你遇到的问题根源在于:ObservableCollection仅监听集合层面的变化(比如添加、删除元素),如果要让集合内对象的属性变更触发通知,对象所属的类必须实现INotifyPropertyChanged接口。你的ControlObjectsPropertyOnHold类只是普通类,属性变更时不会主动触发任何通知事件。

修改方案

让ControlObjectsPropertyOnHold实现INotifyPropertyChanged接口,并为每个需要监听变更的属性添加事件触发逻辑:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class ControlObjectsPropertyOnHold : INotifyPropertyChanged
{
    private string _name;
    private Rhino.DocObjects.ObjRef _objRef;
    private System.Guid _objGuid;

    // 定义PropertyChanged事件
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get => _name;
        set
        {
            if (_name != value)
            {
                _name = value;
                // 触发属性变更通知
                OnPropertyChanged();
            }
        }
    }

    public Rhino.DocObjects.ObjRef ObjRef
    {
        get => _objRef;
        set
        {
            if (_objRef != value)
            {
                _objRef = value;
                OnPropertyChanged();
            }
        }
    }

    public System.Guid ObjGuid
    {
        get => _objGuid;
        set
        {
            if (_objGuid != value)
            {
                _objGuid = value;
                OnPropertyChanged();
            }
        }
    }

    public ControlObjectsPropertyOnHold(string name, Rhino.DocObjects.ObjRef objRef, System.Guid objGuid)
    {
        if (name != null)
        {
            _name = name;
            _objRef = objRef;
            _objGuid = objGuid;
        }
    }

    // 封装事件触发逻辑,[CallerMemberName]自动获取属性名
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

关键说明

  1. 实现INotifyPropertyChanged接口后,每次属性值发生实际变化时,调用OnPropertyChanged触发事件
  2. [CallerMemberName]特性可以避免手动写属性名,减少出错概率
  3. 后续当你修改ObservableCollection中ControlObjectsPropertyOnHold实例的Name等属性时,PropertyChanged事件会正常触发,绑定该属性的UI或监听逻辑就能收到通知

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:06:20