C# 为用户定义的某些属性值的更改创建事件

C# 为用户定义的某些属性值的更改创建事件,c#,.net,oop,events,event-handling,C#,.net,Oop,Events,Event Handling,我正在创建一个自定义控件,我想在其中添加一些属性。 在一些属性上,我想创建一些事件。 说 如果我有财产 public int Date{get;set;} 现在,如果它的值正在更改,我想触发一个更改事件。那么,我如何在这个上添加事件呢?首先,您需要定义您的事件,以及引发事件的方法 然后,您需要从自动实现的属性中切换出来 private int _date; public int Date { get {return _date;} set { if(!_d

我正在创建一个自定义控件,我想在其中添加一些属性。 在一些属性上,我想创建一些
事件
。 说 如果我有财产

public int Date{get;set;}


现在,如果它的值正在更改,我想触发一个更改事件。那么,我如何在这个

上添加事件呢?首先,您需要定义您的事件,以及引发事件的方法

然后,您需要从自动实现的属性中切换出来

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

        _date = value;
    }
}

如果您需要有关事件部分的帮助,我写这篇文章是为了向您提供详细信息。

那么,您首先需要定义您的事件,以及引发事件的方法

然后,您需要从自动实现的属性中切换出来

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

        _date = value;
    }
}
如果您需要有关事件部分的帮助,我写这篇文章是为了向您提供详细信息。

使用“普通”属性而不是自动属性,并在setter中引发更改事件:

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事件,则逻辑将类似,但名称和事件参数不同。

使用“普通”属性而不是自动属性,并在setter中引发更改事件:

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事件,则逻辑将类似,但名称和事件参数不同。

执行此操作的典型模式如下:

// 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事件的实现。对于PropertyChange事件,这是相同的,但是在属性集访问器中指定值之前引发事件。

执行此操作的典型模式如下:

// 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事件的实现。对于PropertyChange事件,这是同样的事情,但是您在属性集访问器中分配值之前引发事件。

您也可以在属性设置器中实现并引发事件,以下是您可以使用和使用的完整代码示例:

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");
        }
    }
}
您还可以在属性设置器中实现并引发一个事件,以下是您可以使用和使用的完整代码示例:

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