由控件触发但传递到所有者列表<>的事件

本文关键字:列表 所有者 事件 控件 | 更新日期: 2023-09-27 18:35:31

我想了解如何将从类引发的事件转发到实现 List 的所有者类<>该类包含引发事件的类。 主类称为 PCCControls,包含List<ControlBox>对象。每个ControlBox都实现一个名为 ButtonPushed 的事件。

我想通过在 PCCControls 类中实现类似于以下内容的事件,将事件从 ControlBox 类移动到 PCCControls

public delegate ControlBoxButtonPushedHandler(object sender, ControlBox controlbox);
public event ControlBoxButtonPushedHandler ButtonPushed;

我有以下几点:

public class PCCControls
{
    List<ControlBox> ControlBoxes;
}  
public class ControlBox
{
    public event ButtonPushed;  
    public ProcessSub()
    {
        if(ButtonPushed != null) ButtonPushed(this, new EventArgs());
    }
}

因此,根据上面的代码,我想将事件ButtonPushedControlBox 类移动到 PCCControls 类,并将触发事件的ControlBox作为参数传递给 ButtonPushed 事件。

这如何实现? 您的支持将不胜感激

由控件触发但传递到所有者列表<>的事件

目前还不清楚你在问什么; 但是,我会试一试。 您可以简单地让PCCControls类订阅ControlBox中的事件:

public class PCCControls
{
    List<ControlBox> ControlBoxes;
// initialization of ControlBoxes done elsewhere...
    public voice SomeMethod()
    {
        ControlBoxes.ElementAt(0).ButtonPushed += controlBox_ButtonPushed;
    }
    public void controlBox_ButtonPushed(object sender, EventArgs e)
    {
        // TODO:
    }
}

如果这不是您想要的,请提供更多详细信息。

如果确保实际列表对 PCCControls 类保持私有(因此客户端代码不能直接向其添加/删除 ControlBox),则可以在添加或删除项时订阅/取消订阅 ControlBox 的 ButtonPush 事件,然后定义自己的事件以将其转发到客户端代码。像这样:

public class PCCControls
{
    public event EventHandler<PCCButtonPushedEventArgs> PCCButtonPushed;
    List<ControlBox> ControlBoxes;
    public void AddControlBox(ControlBox box) 
    {
        box.ButtonPushed += OnButtonPushed;
        ControlBoxes.Add(box);
    }
    public void RemoveControlBox(ControlBox box) 
    {
        box.ButtonPushed -= OnButtonPushed;
        ControlBoxes.Remove(box);
    }
    private void OnButtonPushed(object sender, EventArgs e)
    {
        var handler = PCCButtonPushed;
        if (handler != null) 
        {
           var box = (ControlBox)sender;
           handler(this, new PCCButtonPushedEventArgs(box));
        }
    }
}  
public class ControlBox
{
    public event ButtonPushed;  
    public ProcessSub()
    {
        if(ButtonPushed != null) ButtonPushed(this, new EventArgs());
    }
}