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 postsRecent Posts
- Chapter110:Timers 10/05/2024
- Chapter109:Stream 09/05/2024
- Chapter108:CheckedandUnchecked 08/05/2024