C# 如何从父级到子级触发事件

C# 如何从父级到子级触发事件,c#,events,delegates,C#,Events,Delegates,我有一个列类,它有两个属性名称和值,另一个类(ColumnList)作为集合继承它,我想将一个事件从父类引发到子类,这意味着列值的更改应该在ColumnList类中触发。 下面是我的代码 public class Column { private string colName; private string colValue; public string Name { get { return colNam

我有一个列类,它有两个属性名称和值,另一个类(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()
    {
    }
}
公共类列
{
私有字符串colName;
私有字符串colValue;
公共字符串名
{
得到
{
返回colName;
}
设置
{
colName=值;
if(ColumnValueChangedEvent!=null)
ColumnValueChangedEvent(null,null);
}
}
公共字符串值
{
得到
{
返回colValue;
}
设置
{
colValue=值;
if(ColumnValueChangedEvent!=null)
ColumnValueChangedEvent(null,null);
}
}
公共事件栏目ValueChangedLegate栏目ValueChangedEvent;
public delegate void ColumnValueChangedDelegate(对象发送方,事件参数e);
}
公共类AddColumn:列表
{
公共AddColumn()
:base()
{
}
}

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

如果是,这是不可能的,因为
List
不提供任何机制来告诉继承的类何时将项添加到列表中


您应该创建一个不从
列表继承的新类型。它应该实现IList
IList
或者其他一些取决于您的需求的东西。然后在
Add(Column Column)
方法的实现中,只需订阅事件。

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

如果是,这是不可能的,因为
List
不提供任何机制来告诉继承的类何时将项添加到列表中

您应该创建一个不从
列表继承的新类型。它应该实现IList
IList
或者其他一些取决于您的需求的东西。然后在
Add(Column列)
方法的实现中,只需订阅事件即可。

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

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

    }
}
按Tab Vs将生成如下函数:

private static void Test_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
       // put what ever u need here
    }
****这不一定是静态的****

更新: 如果要更改项目中的文件,请执行以下操作: 例如,假设您想更改
addColumn[0]
处的name字段。 您可以按如下方式进行操作:

var item = addColumn[0];
item.Name = "New VAlue"; 
addColumn[0] = item.Name;
此代码将触发事件。 注意:最好在函数中扭曲它

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

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

    }
}
按Tab Vs将生成如下函数:

private static void Test_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
       // put what ever u need here
    }
****这不一定是静态的****

更新: 如果要更改项目中的文件,请执行以下操作: 例如,假设您想更改
addColumn[0]
处的name字段。 您可以按如下方式进行操作:

var item = addColumn[0];
item.Name = "New VAlue"; 
addColumn[0] = item.Name;
此代码将触发事件。
请注意,最好将其扭曲到函数中

Check InotifyProperty Changed and ObservableCollection如果有任何答案帮助您关闭问题Check InotifyProperty Changed and ObservableCollection如果有任何答案帮助您关闭问题谢谢,在我添加列时它会按要求工作。现在我需要一个事件如果任何项的值发生了更改,则表示集合中的名称或值发生了更改在Replace方法中,您可以更改整个项并使事件发生。谢谢,当我添加列时,它会按要求工作。现在我需要一个事件,如果任何项的值发生更改,则表示集合中的名称或值发生更改。在Replace方法中,您可以更改整个项并引发事件