这个问题引用了另一个问题,我的很相似,但我正在寻求超出我在这个答案中所读内容的帮助:
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/