1+ using System ;
2+
3+ namespace Microsoft . Maui . Controls . Xaml . Diagnostics ;
4+
5+ internal static class BindablePropertyDiagnostics
6+ {
7+ public static ValueSource GetValueSource ( BindableObject bindable , BindableProperty property )
8+ {
9+ if ( bindable == null )
10+ throw new ArgumentNullException ( nameof ( bindable ) ) ;
11+ if ( property == null )
12+ throw new ArgumentNullException ( nameof ( property ) ) ;
13+
14+ var context = bindable . GetContext ( property ) ;
15+ if ( context == null )
16+ return new ValueSource ( BaseValueSource . Unknown ) ;
17+
18+ var specificity = context . Values . GetSpecificityAndValue ( ) . Key ;
19+ if ( specificity == SetterSpecificity . DefaultValue )
20+ return new ValueSource ( BaseValueSource . Default ) ;
21+ if ( specificity == SetterSpecificity . FromBinding )
22+ return new ValueSource ( BaseValueSource . Unknown , isExpression : true ) ;
23+ if ( specificity == SetterSpecificity . ManualValueSetter )
24+ return new ValueSource ( BaseValueSource . Local ) ;
25+ if ( specificity == SetterSpecificity . DynamicResourceSetter )
26+ return new ValueSource ( BaseValueSource . Unknown , isExpression : true ) ;
27+ if ( specificity == SetterSpecificity . VisualStateSetter )
28+ return new ValueSource ( BaseValueSource . Style ) ;
29+ if ( specificity == SetterSpecificity . Trigger )
30+ return new ValueSource ( BaseValueSource . StyleTrigger ) ;
31+ if ( specificity == SetterSpecificity . FromHandler )
32+ return new ValueSource ( BaseValueSource . Unknown , isCurrent : true ) ;
33+
34+ if ( specificity . Vsm > 0 )
35+ return new ValueSource ( BaseValueSource . Local ) ;
36+ if ( specificity . Style > 0 )
37+ return new ValueSource ( BaseValueSource . Style ) ;
38+ if ( specificity . Id > 0 || specificity . Class > 0 || specificity . Type > 0 )
39+ return new ValueSource ( BaseValueSource . Style ) ;
40+ if ( specificity . Manual > 0 )
41+ return new ValueSource ( BaseValueSource . Local ) ;
42+ if ( specificity . DynamicResource > 0 )
43+ return new ValueSource ( BaseValueSource . Unknown , isExpression : true ) ;
44+ if ( specificity . Binding > 0 )
45+ return new ValueSource ( BaseValueSource . Unknown , isExpression : true ) ;
46+
47+ return new ValueSource ( BaseValueSource . Unknown ) ;
48+ }
49+ }
50+
51+ internal struct ValueSource {
52+ public ValueSource ( BaseValueSource baseValueSource , bool isCoerced = false , bool isCurrent = false , bool isExpression = false )
53+ {
54+ BaseValueSource = baseValueSource ;
55+ IsCoerced = isCoerced ;
56+ IsCurrent = isCurrent ;
57+ IsExpression = isExpression ;
58+ }
59+
60+ public BaseValueSource BaseValueSource { get ; }
61+ public bool IsCoerced { get ; }
62+ public bool IsCurrent { get ; } //FromHandler
63+ public bool IsExpression { get ; } //Binding, DynamicResource, etc
64+ public BaseValueSource Unknown { get ; }
65+ }
66+
67+ internal enum BaseValueSource
68+ {
69+ Unknown = 0 , //source is not known
70+ Default = 1 , //source is default value, as defined by BindableProperty.DefaultValue or created by BindableProperty.DefaultValueCreator
71+ Inherited = 2 , //source is a value through property value inheritance (not really supported in Maui)
72+ DefaultStyle = 3 ,
73+ DefaultStyleTrigger = 4 ,
74+ Style = 5 ,
75+ TemplateTrigger = 6 ,
76+ StyleTrigger = 7 ,
77+ ImplicitStyleReference = 8 ,
78+ ParentTemplate = 9 ,
79+ ParentTemplateTrigger = 10 ,
80+ Local = 11 ,
81+
82+ }
0 commit comments