8

Powiedzmy, że mam:Tworzenie zdarzenia uważać na zmiany zmiennej

public Boolean booleanValue; 

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

Jak mogę utworzyć obsługi zdarzeń, które rozpala gdy booleanValue się zmieniło? Czy to możliwe?

+0

Czy to jest winform, ASP.Net lub Silverlight/WPF? –

+0

Jest to aplikacja w stylu Windows 8 Metro. Ale chętnie zaakceptowałbym odpowiedź na cokolwiek innego w języku C# (innym niż Silverlight) – Arrow

Odpowiedz

12

Unikaj ogólnie używania pól publicznych. Staraj się, aby były jak najbardziej prywatne. Następnie możesz użyć właściwości wrappera, która wyzwala twoje wydarzenie. Zobacz przykład:

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

To jeden prosty, "rodzimy" sposób, aby osiągnąć to, czego potrzebujesz. Istnieją inne sposoby, nawet oferowane przez .NET Framework, ale powyższe podejście jest tylko przykładem.

3
  1. Zmiana dostęp do booleanValue do prywatnego i pozwalają jedynie zmieniając go przez jedną z metod konsystencji.

  2. Ogień niestandardowe zdarzenie w tej metodzie

.

private bool _boolValue; 

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

Opcja 2: Zrób to własność i ogień zdarzenie w seter

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

Edit: Jak mówili inni INotifyPropertyChanged jest .NET standardowy sposób to zrobić.

2
CallingClass.BoolChangeEvent += new Action<bool>(AddressOfFunction); 

W swojej klasie z procedurą własności 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

Nie, to nie jest możliwe *, aby otrzymywać powiadomienia o zmian wartości zmiennej.

Możesz osiągnąć prawie to, co chcesz, czyniąc wartość będącą właściwością niektórych zdarzeń klasowych i ogniowych podczas zmiany, tak jak chcesz.

*) jeśli twój kod jest debuggerem dla procesu, możesz spowodować, że CPU powiadomi Cię o zmianach - zobacz punkty przerwania danych w Visual Studio. Będzie to wymagało co najmniej pewnej ilości natywnego kodu i trudniej będzie zaimplementować poprawnie dla zmapowanego kodu z powodu przenikania obiektów, które mają być przenoszone w pamięci przez GC.