【发布时间】:2010-02-02 22:08:38
【问题描述】:
我正在创建一个自定义控件,我想在其中添加一些属性。
在少数几个属性上,我想创建一些events。
说
如果我有财产
public int Date {get; set;}
现在如果它的值正在改变,我想触发一个改变事件。所以我怎么能在这个上添加事件
【问题讨论】:
标签: c# .net oop events event-handling
我正在创建一个自定义控件,我想在其中添加一些属性。
在少数几个属性上,我想创建一些events。
说
如果我有财产
public int Date {get; set;}
现在如果它的值正在改变,我想触发一个改变事件。所以我怎么能在这个上添加事件
【问题讨论】:
标签: c# .net oop events event-handling
使用“普通”属性而不是自动属性,并在 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 事件的实现。对于 PropertyChanging 事件,它是同样的事情,但您在属性集访问器中分配值之前 引发事件。
【讨论】:
嗯,你首先需要定义你的事件,以及一个引发它的方法。
那么你需要从一个自动实现的属性中切换出来
private int _date;
public int Date
{
get {return _date;}
set
{
if(!_date.Equals(value))
//Raise event here
_date = value;
}
}
如果您在活动部分需要一些帮助,请here is a tutorial 我写信给您详细信息。
【讨论】:
您还可以实现 INotifyPropertyChanged interface 并在您的属性设置器中引发一个事件,这里是您可以使用和玩的完整代码示例:
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");
}
}
}
【讨论】: