Chapter88:INotifyPropertyChanged interface

No Comments

Section88.1:ImplementingINotifyPropertyChangedinC#6

TheimplementationofINotifyPropertyChangecanbeerror-prone,astheinterfacerequiresspecifyingproperty nameasastring.Inordertomaketheimplementationmorerobust,anattributeCallerMemberNamecanbeused.

classC:INotifyPropertyChanged

{

//backingfield

intoffset;

//property

publicintOffset

{

get

{

returnoffset;

}

set

{

if(offset==value) return;

offset=value;

RaisePropertyChanged();

}

}

//helpermethodforraisingPropertyChangedevent

voidRaisePropertyChanged([CallerMemberName]stringpropertyName=null)=>PropertyChanged?.Invoke(this,newPropertyChangedEventArgs(propertyName));

//interfaceimplemetation

publiceventPropertyChangedEventHandlerPropertyChanged;

}

IfyouhaveseveralclassesimplementingINotifyPropertyChanged,youmayfinditusefultorefactoroutthe interfaceimplementationandthehelpermethodtothecommonbaseclass:

classNotifyPropertyChangedImpl:INotifyPropertyChanged

{

protectedvoidRaisePropertyChanged([CallerMemberName]stringpropertyName=null)=>PropertyChanged?.Invoke(this,newPropertyChangedEventArgs(propertyName));

//interfaceimplemetation

publiceventPropertyChangedEventHandlerPropertyChanged;

}

classC:NotifyPropertyChangedImpl

{

intoffset;

publicintOffset

{

get{returnoffset;}

set{if(offset!=value){offset=value;RaisePropertyChanged();}}

}

}

Section88.2:INotifyPropertyChangedWithGenericSet Method

TheNotifyPropertyChangedBaseclassbelowdefinesagenericSetmethodthatcanbecalledfromanyderived type.

publicclassNotifyPropertyChangedBase:INotifyPropertyChanged

{

protectedvoidRaisePropertyChanged([CallerMemberName]stringpropertyName=null)=>PropertyChanged?.Invoke(this,newPropertyChangedEventArgs(propertyName));

publiceventPropertyChangedEventHandlerPropertyChanged;

publicvirtualboolSet<T>(refTfield,Tvalue,[CallerMemberName]stringpropertyName=null)

{

if(Equals(field,value)) return

false;

storage=value;

RaisePropertyChanged(propertyName);

returntrue;

}

}

TousethisgenericSetmethod,yousimplyneedtocreateaclassthatderivesfromNotifyPropertyChangedBase.

publicclassSomeViewModel:NotifyPropertyChangedBase

{

privatestring_foo;

privateint_bar;

publicstringFoo

{

get{return_foo;}

set{Set(ref_foo,value);}

}

publicintBar

{

get{return_bar;}

set{Set(ref_bar,value);}

}

}

Asshownabove,youcancallSet(ref_fieldName,value);inaproperty’ssetteranditwillautomaticallyraisea PropertyChangedeventifitisneeded.

You canthen registerto thePropertyChanged eventfrom anotherclass thatneeds tohandle propertychanges.

publicclassSomeListener

{

publicSomeListener()

{

_vm=newSomeViewModel();

_vm.PropertyChanged+=OnViewModelPropertyChanged;

}

privatevoidOnViewModelPropertyChanged(objectsender,PropertyChangedEventArgse)

{

Console.WriteLine($”Property{e.PropertyName}waschanged.”);

}

privatereadonlySomeViewModel_vm;

}

About us and this blog

We are a digital marketing company with a focus on helping our customers achieve great results across several key areas.

Request a free quote

We offer professional SEO services that help websites increase their organic search score drastically in order to compete for the highest rankings even when it comes to highly competitive keywords.

Subscribe to our newsletter!

More from our blog

See all posts
No Comments

Recent Posts

Leave a Comment