c #: создать событие, когда значения полей объекта меняются - PullRequest
7 голосов
/ 08 ноября 2010

Эй, ребята, есть ли способ создать событие, которое будет срабатывать при изменении значений атрибутов / полей объекта? Например, если объект имеет поле с именем

private int number;

И пользователь выполняет действие, которое обновит это число, сработает событие, которое обновит все текстовые поля в форме для отображения текущих значений полей?

EDIT: Извините, да свойства были созданы для каждого поля

Ответы [ 4 ]

20 голосов
/ 08 ноября 2010

Сделайте его свойством, а не полем, и реализуйте INotifyPropertyChanged в своем классе:

class YourClass : INotifyPropertyChanged
{

    private int _number;
    public int Number
    {
        get { return _number; }
        private set
        {
            _number = value;
            OnPropertyChanged("Number");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

}

Затем вы можете явно прослушивать событие PropertyChanged или использовать привязку данных, которая будет обрабатыватьэто автоматически

2 голосов
/ 08 ноября 2010

Вы должны использовать определенные пользователем методы получения и установки (то есть свойства) для ручного запуска события.Посмотрите на этот код, он должен быть довольно простым:

// 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 и меняют ее.Вот где мы запускаем событие.

Очень важно проверить, зарегистрированы ли у нас какие-либо обработчики событий (то есть наше событие не равно нулю), прежде чем мы когда-либо вызовем событие.В другом случае мы получим исключение.

1 голос
/ 08 ноября 2010

Похоже, вы должны проверить интерфейс INotifyPropertyChanged . Это не работает для полей, и вам придется реализовать это вручную.

0 голосов
/ 08 ноября 2010

Где вы собираетесь использовать это?

Если вы собираетесь использовать это в клиентском приложении, то , реализующий INotifyPropertyChanged , является рекомендуемым способом работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...