让两个互不了解的类在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;
}
}
提前感谢您的帮助。
好吧,我不认为我完全理解你,但你可以有一个叫做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应用程序。如果没有,请精确。