繁体   English   中英

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

[英]How to trigger an event form parent to child

我有一个具有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()
    {
    }
}

如果我对您的理解正确,那么是否要为每个添加到Column项的ColumnValueChangedEvent订阅到AddColumn类?

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

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

您需要做的是: 将列表更改为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;

此代码将触发该事件。 请注意,最好在函数中进行扭曲

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM