Создание событий для изменения некоторого значения свойства, которое определяется пользователем - PullRequest
1 голос
/ 03 февраля 2010

Я создаю пользовательский элемент управления и хочу добавить в него некоторые свойства. На нескольких свойствах я хочу создать events. Сказать если у меня есть свойство

public int Date {get; set;}

теперь, если его значение меняется, я хочу вызвать событие изменения. ТАК, как я могу добавить событие на этом

Ответы [ 4 ]

1 голос
/ 03 февраля 2010

Используйте «обычное» свойство, а не автоматическое свойство, и вызовите событие change в установщике:

private int _date;

public int Date
{
  get { return _date; }
  set
  {
    if (value != _date)
    {
      _date = value;
      // raise change event here
    }
  }
}

Чтобы вызвать событие изменения, если это стандартное событие INotifyPropertyChanged.PropertyChanged:

PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
  handler(this, new PropertyChangedEventArgs("Date");
}

Рекомендуется изолировать это в методе OnPropertyChanged.

Если вы вызываете пользовательское событие DateChanged, логика будет аналогичной, но с другими именами и аргументами событий.

0 голосов
/ 03 февраля 2010

Также вы можете реализовать INotifyPropertyChanged интерфейс и просто вызвать событие в вашем установщике свойств, вот полный пример кода, который вы можете использовать и играть с:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Foo : INotifyPropertyChanged
    {
        private object myProperty;
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(sender, e);
            }
        }

        public object MyProperty
        {
            get { return this.myProperty;}
            set
            {
                if (this.myProperty != value)
                {
                    this.myProperty = value;
                    this.OnPropertyChanged(this, new PropertyChangedEventArgs("MyPropery"));
                }
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo();
            foo.PropertyChanged += new PropertyChangedEventHandler(foo_PropertyChanged);

            foo.MyProperty = "test";
        }

        static void foo_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Console.WriteLine("raised");
        }
    }
}
0 голосов
/ 03 февраля 2010

Типичный шаблон для этого будет выглядеть так:

// declare the event
public event EventHandler DateChanged;

// declare backing field for the property
private int _date;

public int Date
{
    get { return _date; }
    set
    {
        // bool indicating whether the new value is indeed 
        // different from the old one
        bool raiseEvent = _date != value;
        // assign the value to the backing field
        _date = value;
        // raise the event if the value has changed
        if (raiseEvent)
        {
            OnDateChanged(EventArgs.Empty);
        }
    }
}

protected virtual void OnDateChanged(EventArgs e)
{
    EventHandler temp = this.DateChanged;
    // make sure that there is an event handler attached
    if (temp != null)
    {
        temp(this, e);
    }
}

В этом примере показана реализация события PropertyChanged . Для события PropertyChanging это то же самое, но вы вызываете событие перед назначением значения в методе доступа набора свойств.

0 голосов
/ 03 февраля 2010

Что ж, вам нужно в первую очередь определить ваше событие и метод для его поднятия.

Тогда вам нужно будет отключиться от автоматически реализованного свойства

private int _date;
public int Date
{
    get {return _date;}
    set
    {
        if(!_date.Equals(value))
            //Raise event here

        _date = value;
    }
}

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

...