private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs (String.Empty);
,这有什么意义吗?在什么地方能用到?
你每拖入一张表,会自动为每个字段生成这样一个属性:
public int 字段 { get { return this._字段; } set { if ((this._字段 != value)) { this.OnIDChanging(value); this.SendPropertyChanging(); this._ID = value; this.SendPropertyChanged("字段"); this.OnIDChanged(); } } }
这里主要内容是为字段赋值,先判断”_字段”变量是否等于原来的值,如果不等,就调用OnExceptionIDChanging方法,开始修改这字段,调用属性将要被修改方法SendPropertyChanging,接着对字段进行赋值,调用属性已经被修改方法SendPropertyChanged,并告诉方法修改的字段为“字段”,OnIDChanged()修改完成。
好了,SendPropertyChanging和SendPropertyChanged的方法你可以去自己的设计器生成的代码里头去看,这两个方法是派生自INotifyPropertyChanging和INotifyPropertyChanged这两个接口,用来通知客户端某个属性将要被修改和已经被修改,在这两个方法体中,实现了PropertyChanging与PropertyChanged两个事件,只要属性被修改,那么这两个事实将被触发,帮助我们收集要更新的字段,你说文件里面没讲PropertyChanging事件,那么你可以看看SendPropertyChanging方法,在这里头呢,并且你前面说的new PropertyChangingEventArgs (String.Empty);传入的空字符串,如果你仔细看设计器生成的代码,在构造函数中写的很清楚:
public PropertyChangingEventArgs(string propertyName);
propertyName是“其值将更改的属性的名称”。
“到后边执行this.PropertyChanging(this, emptyChangingEventArgs);这句的时候也没用了啊?”
你所指的执行其实是发生在通知客户端属性即将要被修改的SendPropertyChanging方法里,并且有PropertyChanging事件被订阅的时候,上面的emptyChangingEventArgs变量则为该事件提供数据,这一点,你可以再看看MSDN在Linq to sql关于对象状态与更改跟踪这节的介绍。
https://msdn.microsoft.com/zh-cn/library/bb386982(v=vs.110).aspx
PropertyChanging方法里,封装了实现Changing接口的方法,通知调用方,属性即将被修改(理论上,调用方应该设置一个值,可以取消本次修改)