如何触发事件形式的父级到子级

时间:2019-08-08 07:55:45

标签: c# events delegates

我有一个具有2个属性Name和Value的列类,另一个类(ColumnList)将其继承为一个集合,我想将一个事件从父类引发到子类,这意味着应在ColumnList中触发列值的更改类。

下面是我的代码

public class Column
{
    private string colName;
    private string colValue;

    public string Name
    {
        get
        {
            return colName;
        }
        set
        {
            colName = value;
            if (ColumnValueChangedEvent != null)
                ColumnValueChangedEvent(null, null);
        }
    }

    public string Value
    {
        get
        {
            return colValue;
        }
        set
        {
            colValue = value;
            if (ColumnValueChangedEvent != null)
                ColumnValueChangedEvent(null, null);
        }
    }

    public event ColumnValueChangedDelegate ColumnValueChangedEvent;
    public delegate void ColumnValueChangedDelegate(object sender, EventArgs e);
}

public class AddColumn : List<Column>
{
    public AddColumn()
        : base()
    {
    }
}

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,您想为ColumnValueChangedEvent类中添加的每个Column项目订阅AddColumn吗?

如果是,则不可能,因为List<T>不提供任何机制来告知将项目添加到列表的继承类。

您应该创建一个不继承自List<T>的新类型。它应该实现IList<T>或其他取决于您的要求。然后,在Add(Column column)方法的实现中,只需订阅事件即可。

答案 1 :(得分:1)

您需要做的是: 将列表更改为ObservableCollection ,如下所示:

public class AddColumn : ObservableCollection<Column>
{
    public AddColumn()
        : base()
    {

    }
}

然后在您的代码中可以按以下方式调用它:

    var addColumn = new AddColumn();
    addColumn.CollectionChanged += Test_CollectionChanged; 

按Tab键将生成一个功能,如下所示:

private static void Test_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
       // put what ever u need here
    }

****这不一定是静态的****

更新:  如果要更改项目中的“归档”,请执行以下操作: 例如,假设您要更改addColumn[0]上的名称字段。 您可以按照以下步骤进行操作:

var item = addColumn[0];
item.Name = "New VAlue"; 
addColumn[0] = item.Name;

此代码将触发该事件。 请注意,最好在函数中使用它