让两个互不了解的类在c#中共享事件

本文关键字:事件 共享 不了解 两个 | 更新日期: 2023-09-27 18:01:36

我有三个类,一个类在配置文件中加载到内存中供以后访问。我的另一个类是mainform。我想要实现的是,当配置类的某些元素被加载时,它们被添加到GUI (WindowsForm)的列表视图中。

我知道你不能直接从其他非主流类访问GUI,在阅读之后,我不想这样做,所以我一直在尝试触发事件来说"配置更新",主流将在适当的时候监听和更新列表视图。所以我创建了第三个类来定义事件和委托等,但在我看到的所有例子中,如果不同的类调用事件,它们都被传递给事件类的共享实例。

这是我应该做的事情吗?当我从mainform类创建配置类时,我应该传递事件类的实例吗?或者是否有一种方法可以让两个彼此一无所知的班级共享一个事件?

我修改了下面的microsoft示例来半演示我需要的内容。

    using System;
public class FireEventArgs : EventArgs
{
    public FireEventArgs(string room, int ferocity)
    {
        this.room = room;
        this.ferocity = ferocity;
    }
    public string room;
    public int ferocity;
}
public class FireAlarm
{
    public delegate void FireEventHandler(object sender, FireEventArgs fe);
    public event FireEventHandler FireEvent;
    public void ActivateFireAlarm(string room, int ferocity)
    {
        FireEventArgs fireArgs = new FireEventArgs(room, ferocity);
        if(FireEvent!=null)FireEvent(this, fireArgs);
    }
}
public class FireEventTest
{
    public static void ExtinguishFire(object sender, FireEventArgs fe)
    {
        Console.WriteLine("'nThe ExtinguishFire function was called by {0}.", sender.ToString());
        if (fe.ferocity < 2)
            Console.WriteLine("This fire in the {0} is no problem.  I'm going to pour some water on it.", fe.room);
        else if (fe.ferocity < 5)
            Console.WriteLine("I'm using FireExtinguisher to put out the fire in the {0}.", fe.room);
        else
            Console.WriteLine("The fire in the {0} is out of control.  I'm calling the fire department!", fe.room);
    }
    public static void Main()
    {
        FireAlarm myFireAlarm = new FireAlarm();
        FireAlarm fireAlarm = new FireAlarm();
        fireAlarm.FireEvent += new FireAlarm.FireEventHandler(ExtinguishFire);
        myFireAlarm.ActivateFireAlarm("Kitchen", 3);
        myFireAlarm.ActivateFireAlarm("Study", 1);
        myFireAlarm.ActivateFireAlarm("Porch", 5);
        return;
    }   
}

提前感谢您的帮助。

让两个互不了解的类在c#中共享事件

好吧,我不认为我完全理解你,但你可以有一个叫做EventDispatcher的类,如果你想让它成为单例,在它里面有一个公共事件

ConfigurationElementLoaded(object sender, ConfigurationElementLoadedArgs args)

和一个公共方法来触发事件:

void FireConfigurationElementLoaded(ConfigurationElement element)

在其中触发事件。

您的mainForm可以通过Singleton实例订阅:EventDispatcher.Instance.ConfigurationElementLoaded += ...

和你的配置可以用FireConfigurationElementLoaded触发事件。

如果这个答案没有帮助,请详细说明你到底想做什么…

嗯,如果这些类对彼此一无所知,我想这会有点混乱,但事实并非如此,对吧?UI知道它想要监听什么事件。

这是绝对没问题的,ui绝对可以知道它应该显示什么,至少通过一个界面。你不想让业务类依赖于UI(你想要一个单向的依赖流)

我会说要么定义一个包含事件的接口,并在FireAlarm中实现它,要么直接监听FireAlarm中的事件。

同样,严格地说,表单外部的代码不能在表单内部使用。对于ui来说,用你编写的自定义EventArgs(包括sender对象)来监听和使用事件是绝对没问题的。

真正重要的是哪个线程正在运行问题代码。只要UI线程(创建UI的线程)访问UI,你就可以运行任何代码。

你发布的代码不工作的原因是什么?

在控件上使用databindind,如果你只是想更新windows窗体的UI上的内容。

创建一个数据层,保存配置文件的信息,并将其属性绑定到接口控件。当你改变属性的值时,数据绑定机制会关心你的UI的更新。

一般来说,我的观点是:如果你使用的框架中已经存在一些东西(在这种情况下是。net框架),适合你的需要,就使用它,不要发明自行车,因为别人已经发明它了:)

DataBinding for WindowsForm示例

看所有的事件的东西,我认为我们正在谈论的是WindowsForm应用程序。如果没有,请精确。