如何实现事件类

时间:2015-09-14 14:34:10

标签: c# winforms events inotifypropertychanged

这个问题是关于另一个问题,我的问题很相似,但除了我在这个答案中读到的内容之外,我正在寻求帮助:

Raise an event whenever a property's value changed?

编辑:我想要完成的是一个全球性的信息" service"在应用程序中,我可以从应用程序内的不同位置写入消息变量,并让用户界面(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;

}

1 个答案:

答案 0 :(得分:0)

修改

根据您编辑的问题,有许多不同的方法。其中之一是将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);
}

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

请注意,我保持简单,只需最少的更改即可完成工作。

原始

将它放在实例化Messageing实例的位置,例如在表单的构造函数或load事件处理程序中:

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实例的位置,例如在表单的构造函数或load事件处理程序中:

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

将其添加到表单中:

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