这个问题是关于另一个问题,我的问题很相似,但除了我在这个答案中读到的内容之外,我正在寻求帮助:
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;
}
答案 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!");
}