Linq to SQL INotifyPropertyChanging 接口作用

.Net技术 码拜 9年前 (2015-10-09) 1551次浏览
使用设计器生成的实体类会实现两个接口INotifyPropertyChanged和INotifyPropertyChanging,其中INotifyPropertyChanging这个接口有什么用呢?在什么地方会用到呢?而且生成代码中声明的事件实例传了一个空字符串(

private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs (String.Empty);

,这有什么意义吗?在什么地方能用到?

解决方案:40分
仔细看设计器的源码,如果真的仔细去看的话,也基本上能看得出来他的实现过程:

你每拖入一张表,会自动为每个字段生成这样一个属性:

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是“其值将更改的属性的名称”。

解决方案:80分
你盯着这个String.Empty值是干啥呀?他不过是因为静态对象emptyChangingEventArgs初始化时要赋值一个实例给他,而PropertyChangingEventArgs的构造函数必须要有一个propertyName参数,所以设计器全部默认使用了String.Empty,你看着不爽可以改掉他,你是可以这么做的,本身linq to sql设计器生成的都是分布类跟分布方法,就是知道很多人不够用,需要进行扩展,里面的属性、方法你都可以改。

“到后边执行this.PropertyChanging(this, emptyChangingEventArgs);这句的时候也没用了啊?”

你所指的执行其实是发生在通知客户端属性即将要被修改的SendPropertyChanging方法里,并且有PropertyChanging事件被订阅的时候,上面的emptyChangingEventArgs变量则为该事件提供数据,这一点,你可以再看看MSDN在Linq to sql关于对象状态与更改跟踪这节的介绍。

https://msdn.microsoft.com/zh-cn/library/bb386982(v=vs.110).aspx

解决方案:10分
在属性修改前调用,允许调用者得到修改前的值
解决方案:10分

PropertyChanging方法里,封装了实现Changing接口的方法,通知调用方,属性即将被修改(理论上,调用方应该设置一个值,可以取消本次修改)


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Linq to SQL INotifyPropertyChanging 接口作用
喜欢 (0)
[1034331897@qq.com]
分享 (0)