如何实现事件 class

How to implement an event class

这个问题参考了另一个问题,我的很相似,但我正在寻求超出我在这个答案中所读内容的帮助:

Raise an event whenever a property's value changed?

编辑:我想要完成的是应用程序中的全局消息 "service" 这样我就可以从应用程序中的不同位置写入消息变量并拥有用户界面(winform) 意识到该变量发生了一些变化,并根据事件,我可以读取消息变量并将其内容显示给用户。我希望现在这更有意义。

首先,我是 C# 世界的新手,虽然我理解编写的代码是最被接受的答案,但我失败的地方是理解最终的实现。如果我将此代码放在 .cs 文件中,并在 winform 文件中使用命名空间,我该如何完成实施?在我的例子中,我想在 winform 文件中实现 class 以便我可以观察事件的发生。一旦事件发生,我将通过 winform 界面向用户写入一些信息。我想我需要使用字符串的 "get" ……但不确定实施情况如何?如果这没有意义,我提前道歉,我正在尝试将它们拼凑在一起。感谢您对此的任何帮助!

作为参考,我从提供的答案开始,并根据我的目的对其进行了修改:

public class Messaging : INotifyPropertyChanged
{
    private string dLMessage;

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    public string DLMessage
    {
        get { return dLMessage; }
        set
        {
            if (value != dLMessage)
            {
                dLMessage = value;
                OnPropertyChanged("DLMessage");
                OnDLMessageChanged(EventArgs.Empty);
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


    protected void OnDLMessageChanged(EventArgs e)
    {
        EventHandler handler = DLMessageChanged;
        if (handler != null)
            handler(this, e);
    }

    public event EventHandler DLMessageChanged;

}

编辑


根据您编辑的问题,有很多不同的方法。其中之一是使 DLMesaage 属性 及其更改事件静态化:

public class Messaging 
{
    private static string dLMessage;

    public static string DLMessage
    {
        get { return dLMessage; }
        set
        {
            if (value != dLMessage)
            {
                dLMessage = value;
                OnDLMessageChanged(EventArgs.Empty);
            }
        }
    }

    protected static void OnDLMessageChanged(EventArgs e)
    {
        EventHandler handler = DLMessageChanged;
        if (handler != null)
            handler(null, e);
    }

    public static event EventHandler DLMessageChanged;

}

然后以这种方式在所有不同的表单中订阅事件(例如在表单加载事件中)

Messaging.DLMessageChanged += msg_DLMessageChanged;

以这种形式具有此功能:

void msg_DLMessageChanged(object sender, EventArgs e)
{
    MessageBox.Show("at last changed!");
}

您可以通过以下方式取消订阅活动:

Messaging.DLMessageChanged -= msg_DLMessageChanged;

例如,如果您订阅了某些形式的活动,您可以将退订代码放在 Dispose override:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        Messaging.DLMessageChanged -= msg_DLMessageChanged;
        components.Dispose();
    }
    base.Dispose(disposing);
}

这样,如果您关闭表单,事件将永远不会在该表单中处理。

请注意,我保持简单是为了让您以最少的更改完成工作。

原创


把这个放在你实例化消息实例的地方,例如在你的表单的构造函数或加载事件处理程序中:

Messaging msg = new Messaging();
msg.DLMessageChanged += msg_DLMessageChanged;

将此添加到表格中:

void msg_DLMessageChanged(object sender, EventArgs e)
{
    MessageBox.Show("at last changed!");
    //You can access the new value using Messaging.DLMessage 
}

而且,如果您只需要 DLMessageChanged,您似乎也不需要实施 INotifyPropertyChanged。现在您正在引发这两个事件。

或者如果您想使用 PropertyChanged 事件,请将其放在您实例化 Messageing 实例的地方,例如在表单的构造函数或加载事件处理程序中:

Messaging msg = new Messaging();
msg.PropertyChanged+= msg_PropertyChanged;

将此添加到表格中:

void msg_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "DLMessage")
        MessageBox.Show("at last changed!");
}