只要变量的值在c#中的类中发生变化,就在main中引发一个事件?

时间:2015-12-04 07:28:34

标签: c# windows-forms-designer

我在一个类中有一个更改的事件,它是在变量的值更改时触发的,但我不知道如何向我的C#窗体的主窗口发送通知,例如,显示一个消息框到通知更改的值。我不想设置一个计时器来检查每一秒的响应。有更好的方法吗?

3 个答案:

答案 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,但另外我会建议以下内容:

  1. 在您的属性设置器中,检查分配给您的属性的值是否真正更改了属性的值。其他你可能经常触发通知更改。
  2. 您还应该实现ISupportInitialize。通常,您触发属性更改事件以通知主表单数据已更改并需要保存。但是如果您从例如加载实例一个数据库,属性更改事件也会触发,表明数据已经改变,这在这个意义上是不正确的。使用ISupportInitialize,您可以告诉您的实例他们正在启动并且他们不应该触发通知属性更改事件。
  3. 以下是一些示例代码:

    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();