【问题标题】:How to implement an event class如何实现事件类
【发布时间】:2015-12-10 14:43:47
【问题描述】:

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

Raise an event whenever a property's value changed?

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

首先,我是 C# 世界的新手,虽然我理解编写的代码是最被接受的答案,但我失败的地方是理解最终实现。如果我将此代码放在 .cs 文件中并在 winform 文件中使用命名空间,我该如何完成实现?就我而言,我想在 winform 文件中实现该类,以便我可以观察事件的发生。一旦事件发生,我会通过 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;

}

【问题讨论】:

    标签: c# winforms events inotifypropertychanged


    【解决方案1】:

    编辑


    根据您编辑的问题,有很多不同的方法。其中之一是将 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覆盖:

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

    【讨论】:

    • 我正在尝试对此的实现,但仍然遇到困难。我将编辑问题并添加更多详细信息。感谢您到目前为止的帮助...
    • 所以为了初始化一个事件,我会从代码中的某处写入变量 dLMessage ,它应该触发一个事件,该事件将被捕获,最终显示弹出框,对吗?
    • @KevinZarzycki 是的,每个订阅事件的表单都会收到它并显示一个消息框(如果您在每个表单中处理事件的方法中放置一个消息框)
    • @KevinZarzycki 实际上调用handler(this, e); 将导致所有附加到此事件的处理程序的执行。
    • @KevinZarzycki 您可以阅读编辑以了解如何取消订阅活动。
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多