Skip to content

Commit 74937f4

Browse files
StephaneDelcroixPureWeen
authored andcommitted
[X] GetValueSource
first pass on a GetSourceValue API
1 parent 8d81d12 commit 74937f4

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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

Comments
 (0)