NotifyPropertyChanged事件,其中事件参数包含旧值创建一个?例如:publicStringProcessDescription{get{return_ProcessDescription;}set{if(value!=ProcessDescription){StringoldValue=_ProcessDescription;_ProcessDescription=值;InvokePropertyChanged("ProcessDescription",oldvalue);}}}InvokePropertyChanged(StringProperty)Name,O{this.PropertyChanged(newExtendedPropertyChangedEventArgs(PropertyName,OldValue));我还会讨论像PropertyChanging这样的事件,无论它是否支持e.Cancel,它都会提供此信息。正如答案所暗示的,我必须实施自己的解决方案。为了其他人的利益,我在这里提出:扩展PropertyChanged事件该事件专门设计用于向后兼容旧的propertyChanged事件。它可以通过简单的PropertyChangedEventArgs与调用方互换使用。当然,在这种情况下,事件处理程序负责检查传递的PropertyChangedEventArgs是否可以向下转换为PropertyChangedExtendedEventArgs如果他们想使用它。如果他们对PropertyName属性感兴趣,则不需要向下转型。公共类PropertyChangedExtendedEventArgs:PropertyChangedEventArgs{publicvirtualTOldValue{get;私有集;}publicvirtualTNewValue{get;私有集;新值=新值;}}扩展PropertyChanged接口如果程序员想创建一个事件强制通知属性包含旧值和新值,他只需要实现以下接口://摘要:通知客户属性值正在更改,但包括扩展事件信息/*当您希望强制包含旧值和*新值时,将使用以下NotifyPropertyChanged接口。(用户必须提供PropertyChangedExtendedEventArgs,PropertyChangedEventArgs是不允许的。)*/publicinterfaceINotifyPropertyChangedExtended{eventPropertyChangedExtendedEventHandlerPropertyChanged;}publicdelegatevoidPropertyChangedExtendedEventHandler(objectsender,PropertyChangedExtendedEventArgse);示例1用户现在可以指定更高级的NotifyPropertyChanged方法,它允许属性设置器传递其旧值:publicStringtestString{get{returntestString;}set{Stringtemp=testString;测试值2=值;NotifyPropertyChanged("TestString",temp,value);你的新NotifyPropertyChanged方法看起来像这样:}OnPropertyChanged等同于:publicvirtualvoidOnPropertyChanged(PropertyChangedEventArgse){PropertyChangedEventHandlerhandler=PropertyChanged;如果(处理程序!=null)处理程序(发件人,e);}示例2或者,如果您更喜欢使用lambda表达式并完全取消硬编码的属性名称字符串,您可以使用以下命令:publicStringTestString{get{returntestString;}privateset{SetNotifyingProperty(()=>TestString,reftestString,value);}}以下魔术支持以下内容:protectedvoidSetNotifyingProperty(Expression>expression,refTfield,Tvalue){if(field==null||!field.Equals(value)){dValue=字段;字段=值;OnPropertyChanged(this,newPropertyChangedExtendedEventArgs(GetPropertyName(expression),oldValue,value));}}protectedstringGetPropertyName(Expression>expression){MemberExpressionmemberExpression=(MemberExpression)expression.Body;返回成员表达式。成员名字;}性能如果性能是一个问题,请参阅以下问题:ImplementingNotifyPropertyChangedwithoutmagicstrings总的来说,开销很小。添加旧值并切换到扩展事件是大约15%的减速,仍然允许每秒大约一百万个属性通知,而切换到lambda表达式是5倍的减速,允许每秒大约十万个属性通知。这些数字远不是任何UI驱动应用程序的瓶颈。听起来您想将INotifyPropertyChanging与INotifyPropertyChanged结合使用。MsdnDocumentationhttp://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanging.aspx如果您只想要旧值,可以在更改属性值之前调用事件。但这将偏离此事件的正常使用方式,因此我会为其创建一个专用接口和参数。不,您必须从头开始创建自己的。我曾经在我的研究项目Granite中做过同样的事情,但我开始意识到它不值得付出代价。我正在计算太多的属性无法与我一起工作,并且必须运行它们两次以引发事件太昂贵了。以上是C#学习教程:NotifyPropertyChanged事件,其中事件args包含了旧值共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
