c# - 如何实现一个事件类

标签 c# winforms events inotifypropertychanged

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

Raise an event whenever a property's value changed?

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

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

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

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!");
}

关于c# - 如何实现一个事件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32567494/

相关文章:

c# - 在 CQRS 中注册 EventHandler

c# - WCF 安全支持提供程序接口(interface) (SSPI) 协商失败

c# - 将颜色与6位颜色相互转换

c# - 删除代码中的冗余

javascript - 将 service-worker 与 Angular.js Controller 进行通信

Java:在 SQL 数据库中对事件执行某些操作?

c# - 从数组创建位图对象

c# - 复制 ado.net 数据表列表的最快方法

c# - 如何避免在 Entity Framework 中加载集合属性

c++ - 运行 WinForm 的函数 "In Background"(VS2010 c++)