Вы должны использовать определенные пользователем методы получения и установки (то есть свойства) для ручного запуска события.Посмотрите на этот код, он должен быть довольно простым:
// We declare a delegate to handle our event
delegate void StateChangedEventHandler(object sender, StateChangedEventArgs e);
// We declare event arguments class to specify, which value has changed to which value.
public class StateChangedEventArgs: EventArgs
{
string propertyName;
object oldValue;
object newValue;
/// <summary>
/// This is a constructor.
/// </summary>
public StateChangedEventArgs(string propertyName, object oldValue, object newValue)
{
this.propertyName = propertyName;
this.oldValue = oldValue;
this.newValue = newValue;
}
}
/// <summary>
/// Our class that we wish to notify of state changes.
/// </summary>
public class Widget
{
private int x;
public event StateChangedEventHandler StateChanged;
// That is the user-defined property that fires the event manually;
public int Widget_X
{
get { return x; }
set
{
if (x != value)
{
int oldX = x;
x = value;
// The golden string which fires the event:
if(StateChanged != null) StateChanged.Invoke(this, new StateChangedEventArgs("x", oldX, x);
}
}
}
}
Наша переменная-член определена как приватная, поэтому никто за пределами класса Widget не может получить к ней доступ;они вынуждены использовать свойство Widget_X, и как только они это сделают, есть два случая:
- Они получают переменную
x
.Ничего не поделаешь. - Они устанавливают для переменной
x
то же значение, что и раньше.Нечего делать.Мы проверяем это внутри сеттера. - Они устанавливают переменную
x
и меняют ее.Вот где мы запускаем событие.
Очень важно проверить, зарегистрированы ли у нас какие-либо обработчики событий (то есть наше событие не равно нулю), прежде чем мы когда-либо вызовем событие.В другом случае мы получим исключение.