【问题标题】:Create an event to watch for a change of variable创建一个事件来观察变量的变化
【发布时间】:2012-12-20 19:56:22
【问题描述】:

假设我有:

public Boolean booleanValue;

public bool someMethod(string value)
{
   // Do some work in here.
   return booleanValue = true;
}

如何创建一个在 booleanValue 更改时触发的事件处理程序?有可能吗?

【问题讨论】:

  • 这是 winform、ASP.Net 还是 Silverlight/WPF?
  • 这是一个 Windows 8 Metro 风格的应用程序。但我很乐意接受 C# 中其他任何内容的答案(Silverlight 除外)

标签: c# .net event-handling microsoft-metro inotifypropertychanged


【解决方案1】:
  1. 将 BooleanValue 的访问权限更改为私有,并且只允许通过一种方法更改以保持一致性。

  2. 在该方法中触发您的自定义事件

.

private bool _boolValue;

public void ChangeValue(bool value)
{
    _boolValue = value;
   // Fire your event here
}

选项 2:将其设为属性并在 setter 中触发事件

public bool BoolValue { get { ... }  set { _boolValue = value; //Fire Event } }

编辑:正如其他人所说,INotifyPropertyChanged 是执行此操作的 .NET 标准方式。

【讨论】:

    【解决方案2】:

    不,不可能*收到有关变量值更改的通知。

    您几乎可以通过将值设置为某些类的属性并根据需要在更改时触发事件来实现您想要的。

    *) 如果您的代码是某个进程的调试器,您可以让 CPU 通知您更改 - 请参阅 Visual Studio 中的数据更改断点。这将需要至少一些本机代码,并且由于 GC 将对象移动到内存中,因此更难正确实现管理代码。

    【讨论】:

      【解决方案3】:
      CallingClass.BoolChangeEvent += new Action<bool>(AddressOfFunction);
      

      在你的类中使用 bool 属性过程:

      public event Action<bool> BoolChangeEvent;
      public Boolean booleanValue;
      public bool someMethod(string value)
      {
         // Raise event to signify the bool value has been set.
         BoolChangeEvent(value);
      
         // Do some work in here.
         booleanValue = true;
         return booleanValue;
      }
      

      【讨论】:

        【解决方案4】:

        INotifyPropertyChanged 已定义为通知属性是否更改。

        将变量包装在属性中并使用INotifyPropertyChanged 接口。

        【讨论】:

          【解决方案5】:

          或许可以看看INotifyPropertyChanged 接口。你一定会在未来再次遇到它的用途:

          MSDN:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

          【讨论】:

            【解决方案6】:

            通常避免使用公共字段。尽量将它们保密。然后,您可以使用包装器属性触发您的事件。看例子:

            class Foo
            {
                Boolean _booleanValue;
            
                public bool BooleanValue
                {
                    get { return _booleanValue; }
                    set
                    {
                        _booleanValue = value;
                        if (ValueChanged != null) ValueChanged(value);
                    }
                }
            
                public event ValueChangedEventHandler ValueChanged;
            }
            
            delegate void ValueChangedEventHandler(bool value);
            

            这是一种简单的“原生”方式来满足您的需求。还有其他方法,甚至由 .NET Framework 提供,但上述方法只是一个示例。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-12-19
              • 1970-01-01
              • 2017-12-28
              • 2021-10-17
              • 1970-01-01
              • 2021-05-05
              相关资源
              最近更新 更多