web-dev-qa-db-ja.com

変数の変更を監視するイベントを作成します

私が持っているとだけ言いましょう:

public Boolean booleanValue;

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

BooleanValueが変更されたときに起動するイベントハンドラーを作成するにはどうすればよいですか?出来ますか?

8
Arrow

一般に、パブリックフィールドの使用は避けてください。できるだけ非公開にしてください。次に、イベントを発生させるラッパープロパティを使用できます。例を参照してください。

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

これは、必要なことを実現するための1つのシンプルな「ネイティブ」な方法です。 .NET Frameworkによって提供される方法もありますが、上記のアプローチは単なる例です。

13
Mir

INotifyPropertyChanged は、プロパティが変更された場合に通知するようにすでに定義されています。

変数をプロパティでラップし、 INotifyPropertyChanged インターフェイスを使用します。

8
Tilak
  1. BooleanValueのアクセスをprivateに変更し、一貫性を保つために1つのメソッドでのみ変更を許可します。

  2. そのメソッドでカスタムイベントを発生させます

private bool _boolValue;

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

オプション2:それをプロパティにして、セッターでイベントを発生させます

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

編集:他の人が言っているように、INotifyPropertyChangedはこれを行うための.NET標準的な方法です。

3
lahsrah

おそらく、INotifyPropertyChangedインターフェースを見てください。あなたは将来再びそれが使われることに出くわすに違いありません:

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

2
Simon Whitehead
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;
}
2
Jeremy Thompson

いいえ、変数の値の変更について通知を受け取ることはできません*。

値をいくつかのクラスのプロパティにし、必要に応じて変更時にイベントを発生させることで、ほぼ必要なことを達成できます。

*)コードがプロセスのデバッガーである場合は、CPUに変更を通知させることができます。VisualStudioのデータ変更ブレークポイントを参照してください。これには、少なくともある程度のネイティブコードが必要であり、GCによってメモリ内でオブジェクトが移動される可能性があるため、管理されたコードを正しく実装するのは困難です。

2
Alexei Levenkov