C# 级联IPropertyChanged

C# 级联IPropertyChanged,c#,C#,我有一个组织如下的数据结构: 一个列表,包含一个列表,其中包含一个列表 我希望能够在别名/符号/图形中发生任何更改时,在Graphic类中运行函数。我能看到的实现这一点的最佳方法是在三个类中的每一个类上实现IPropertyChanged。但是,是否可以在引用图形的同时级联这些内容,以了解具体更改的内容 注意:更改通常是对别名中的属性进行的,但是可以删除/添加或重命名符号也是合理的。您可以利用实现INotifyCollectionChanged和INotifyPropertyChanged的类O

我有一个组织如下的数据结构:

一个
列表
,包含一个
列表
,其中包含一个
列表

我希望能够在别名/符号/图形中发生任何更改时,在
Graphic
类中运行函数。我能看到的实现这一点的最佳方法是在三个类中的每一个类上实现
IPropertyChanged
。但是,是否可以在引用
图形的同时级联这些内容,以了解具体更改的内容


注意:更改通常是对
别名中的属性进行的,但是可以删除/添加或重命名
符号也是合理的。

您可以利用实现
INotifyCollectionChanged
INotifyPropertyChanged
的类
ObservableCollection

基本上,您需要创建一个派生类并重写一些方法

    public class Data
    {
        public ObservableCollection<String> InnerCollection { get; set; }
    }

    public class collection : ObservableCollection<Data>
    {
        protected override void InsertItem(int index, Data item)
        {
            item.InnerCollection.CollectionChanged += InnerCollection_CollectionChanged;
            base.InsertItem(index, item);
        }

        private void InnerCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            //Actually it does not make any sense. You may need to construct something special. But firing an event it would be enough
            OnCollectionChanged(e);
        }

        protected override void RemoveItem(int index)
        {
            var date = base.Items[index];
            date.InnerCollection.CollectionChanged -= InnerCollection_CollectionChanged;
            base.RemoveItem(index);
        }
    }
公共类数据
{
公共ObservableCollection InnerCollection{get;set;}
}
公共类集合:ObservableCollection
{
受保护的覆盖无效插入项(整数索引,数据项)
{
item.InnerCollection.CollectionChanged+=InnerCollection\u CollectionChanged;
基本插入项(索引,项目);
}
私有void InnerCollection\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//事实上,这没有任何意义。你可能需要构造一些特殊的东西。但是触发一个事件就足够了
非集合更改(e);
}
受保护的覆盖void removietem(int索引)
{
var日期=基本项目[索引];
date.InnerCollection.CollectionChanged-=InnerCollection\u CollectionChanged;
基本删除项(索引);
}
}

使用类似的工具,您可以将活动安排得尽可能深入。

干杯!这正是我所需要的。您还可以将BindingList用于实现此功能的内置集合。