[英]How to raise an event on Property Change?
当我使用DataSet时,有可能在RowChanging,RowChanged,ColumnChanging,ColumnChanged等上引发事件......
如何对Entity Framework中的实体进行相同的操作?
实体已经实现了PropertyChanged
事件,因为它们实现了System.ComponentModel.INotifyPropertyChanged
。 如果您想捕获对您的entieis的更改,您可以只订阅它。
另请注意,实体支持以下两个部分方法 - 第二个方法应该为您提供相当于“RowChanging”的功能 - 如果您想要响应类中的更改,可以覆盖它们:
protected override void OnPropertyChanged(string property) {}
protected override void OnPropertyChanging(string property) {}
您可以执行以下操作来在Entity Framework中更改属性上的事件:假设您有Pubs数据库 - 它有一个具有以下表结构的表employee
:
现在我们要跟踪物业hire_date
任何变化。 您可以通过以下方式执行此操作(此示例可以在LinqPad中轻松使用 - 您只需要定义EF数据源,然后就可以运行该示例):
void Main()
{
var test=new employee();
test.PropertyChanged += HandleSomethingHappening;
test.hire_date = DateTime.Now;
}
public void HandleSomethingHappening(object sender, EventArgs e)
{
var propName=((System.ComponentModel.PropertyChangedEventArgs)e).PropertyName;
var empObj=(employee)sender;
if (propName=="hire_date")
{
Console.WriteLine(propName+" changed to: " + empObj.hire_date.Date.ToString("d"));
}
}
如果你运行它,它会显示
雇用日期已更改:17.09.2015
在控制台上,因为在main方法中我们通过以下方式更改了属性:
test.hire_date = DateTime.Now;
NB
test.PropertyChanged -= HandleSomethingHappening;
test2.PropertyChanged +=
(c, a) => Console.WriteLine(((System.ComponentModel.PropertyChangedEventArgs)a).PropertyName + " property has changed in employee entity");
PropertyChanging
事件,该事件将在更改发生之前触发 高级提示:
如果您想更好地了解幕后发生的事情,我将提供employee
类的简化代码(只是运行上述示例所需的属性和事件):
public class employee //: EntityObject
{
#region Primitive Properties
public global::System.DateTime hire_date
{
get
{
return _hire_date;
}
set
{
//Onhire_dateChanging(_hire_date);
_hire_date=value;
Onhire_dateChanged();
}
}
private DateTime _hire_date;
void Onhire_dateChanged()
{
var handler = this.PropertyChanged; // copy before access (to aviod race cond.)
if (handler != null)
{
var args=new PropertyChangedEventArgs() { PropertyName="hire_date" };
handler(this, (System.EventArgs)args);
}
}
public event EventHandler PropertyChanged;
#endregion
}
public class PropertyChangedEventArgs: System.EventArgs
{
public string PropertyName { get; set; }
}
您可以看到事件是如何连接的 - 它在属性的set
方法中被触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.