我在一个类中有一个更改的事件,它是在变量的值更改时触发的,但我不知道如何向我的C#窗体的主窗口发送通知,例如,显示一个消息框到通知更改的值。我不想设置一个计时器来检查每一秒的响应。有更好的方法吗?
答案 0 :(得分:2)
您可能正在寻找INotifyPropertyChanged
,这是WPF中的常见模式,但它也可以用于Windows窗体。文档页面上有一个非常大的例子:
https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
class SomeClass : INotifyPropertyChanged
{
private int foo;
public event PropertyChangedEventHandler PropertyChanged;
public int Foo
{
get { return foo; }
set
{
if (foo == value)
return;
foo = value;
PropertyChanged("Foo");
}
}
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
请注意,大部分内容变得更安全且更少样板you use newer .NET features,例如[CallerMemberName]
答案 1 :(得分:0)
您应该使用“ Property ”(Getter和Setter)包装变量。
然后你可以在“Setter”中实现你自己的事件,或者你可以从WPF触发属性更改事件(如果你使用的是WPF)。
答案 2 :(得分:0)
正如其他发布的那样,你应该阻止INotifyPropertyChanged,但另外我会建议以下内容:
以下是一些示例代码:
class MyTest : INotifyPropertyChanged, ISupportInitialize
{
public event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);
private bool _IsInitializing;
private bool _MyProperty;
public void BeginInit()
{
_IsInitializing = true;
}
public void EndInit()
{
_IsInitializing = false;
}
public bool MyProperty {
get { return _MyProperty; }
set {
if (_MyProperty == value)
return;
_MyProperty = value;
OnPropertyChanged("MyProperty");
}
}
private void OnPropertyChanged(string propertyName)
{
if (_IsInitializing)
return;
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
对于初始化,您可以编写(以防止属性更改事件被激活):
MyTest thisTest = new MyTest();
thisTest.BeginInit();
thisTest.MyProperty = true;
thisTest.EndInit();