@@ -435,6 +435,42 @@ public void HasExplicitSafeAreaEdges_StyleValueCountsAsExplicit()
435435 Assert . True ( ( ( ISafeAreaElement ) layout ) . HasExplicitSafeAreaEdges ) ;
436436 }
437437
438+ [ Fact ]
439+ public void SafeAreaEdgesSpecificityChangesUpdateHandlerOnlyOnce ( )
440+ {
441+ var view = new CustomSafeAreaView ( ) ;
442+ var defaultEdges = view . SafeAreaEdges ;
443+ var styleSpecificity = new SetterSpecificity (
444+ SetterSpecificity . StyleLocal ,
445+ id : 0 ,
446+ @class : 0 ,
447+ type : 0 ) ;
448+
449+ view . ResetSafeAreaHandlerUpdateCount ( ) ;
450+ view . SetValue ( CustomSafeAreaView . SafeAreaEdgesProperty , defaultEdges , styleSpecificity ) ;
451+
452+ Assert . True ( ( ( ISafeAreaElement ) view ) . HasExplicitSafeAreaEdges ) ;
453+ Assert . Equal ( 1 , view . SafeAreaHandlerUpdateCount ) ;
454+
455+ view . SetValue ( CustomSafeAreaView . SafeAreaEdgesProperty , defaultEdges , styleSpecificity ) ;
456+
457+ Assert . Equal ( 1 , view . SafeAreaHandlerUpdateCount ) ;
458+
459+ view . SetValue (
460+ CustomSafeAreaView . SafeAreaEdgesProperty ,
461+ defaultEdges ,
462+ SetterSpecificity . ManualValueSetter ) ;
463+
464+ Assert . Equal ( 2 , view . SafeAreaHandlerUpdateCount ) ;
465+
466+ view . SetValue (
467+ CustomSafeAreaView . SafeAreaEdgesProperty ,
468+ defaultEdges ,
469+ SetterSpecificity . ManualValueSetter ) ;
470+
471+ Assert . Equal ( 2 , view . SafeAreaHandlerUpdateCount ) ;
472+ }
473+
438474 [ Fact ]
439475 public void HasExplicitSafeAreaEdges_BindingValueCountsAsExplicit ( )
440476 {
@@ -462,12 +498,24 @@ sealed class CustomSafeAreaView : View, ISafeAreaElement
462498 {
463499 public static readonly BindableProperty SafeAreaEdgesProperty = SafeAreaElement . SafeAreaEdgesProperty ;
464500
501+ public int SafeAreaHandlerUpdateCount { get ; private set ; }
502+
465503 public SafeAreaEdges SafeAreaEdges
466504 {
467505 get => ( SafeAreaEdges ) GetValue ( SafeAreaEdgesProperty ) ;
468506 set => SetValue ( SafeAreaEdgesProperty , value ) ;
469507 }
470508
509+ public void ResetSafeAreaHandlerUpdateCount ( ) => SafeAreaHandlerUpdateCount = 0 ;
510+
511+ private protected override void UpdateHandlerValue ( string propertyName , bool valueChanged )
512+ {
513+ if ( propertyName == SafeAreaEdgesProperty . PropertyName && valueChanged )
514+ SafeAreaHandlerUpdateCount ++ ;
515+
516+ base . UpdateHandlerValue ( propertyName , valueChanged ) ;
517+ }
518+
471519 bool ISafeAreaElement . HasExplicitSafeAreaEdges => SafeAreaElement . IsSafeAreaEdgesSet ( this ) ;
472520
473521 SafeAreaEdges ISafeAreaElement . GetDefaultSafeAreaEdges ( ) => SafeAreaEdges . Container ;
0 commit comments