2 using System.Collections.Generic;
3 using System.Reflection;
4 using System.Runtime.CompilerServices;
6 using Tizen.NUI.Binding.Internals;
9 namespace Tizen.NUI.Binding
11 [ContentProperty("Value")]
12 [ProvideCompiled("Tizen.NUI.Core.XamlC.SetterValueProvider")]
13 internal sealed class Setter : IValueProvider
15 readonly ConditionalWeakTable<BindableObject, object> _originalValues = new ConditionalWeakTable<BindableObject, object>();
17 public BindableProperty Property { get; set; }
19 public object Value { get; set; }
21 object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
25 var lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
26 IXmlLineInfo lineInfo = lineInfoProvider != null ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
27 throw new XamlParseException("Property not set", lineInfo);
29 var valueconverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider;
31 Func<MemberInfo> minforetriever =
33 (MemberInfo)Property.DeclaringType.GetRuntimeProperty(Property.PropertyName) ?? (MemberInfo)Property.DeclaringType.GetRuntimeMethod("Get" + Property.PropertyName, new[] { typeof(BindableObject) });
35 object value = valueconverter?.Convert(Value, Property.ReturnType, minforetriever, serviceProvider);
40 internal void Apply(BindableObject target, bool fromStyle = false)
43 throw new ArgumentNullException("target");
47 object originalValue = target.GetValue(Property);
48 if (!Equals(originalValue, Property.DefaultValue))
50 _originalValues.Remove(target);
51 _originalValues.Add(target, originalValue);
54 var dynamicResource = Value as DynamicResource;
55 var binding = Value as BindingBase;
57 target.SetBinding(Property, binding.Clone(), fromStyle);
58 else if (dynamicResource != null)
59 target.SetDynamicResource(Property, dynamicResource.Key, fromStyle);
62 if (Value is IList<VisualStateGroup> visualStateGroupCollection)
63 target.SetValue(Property, visualStateGroupCollection.Clone(), fromStyle);
65 target.SetValue(Property, Value, fromStyle);
69 internal void UnApply(BindableObject target, bool fromStyle = false)
72 throw new ArgumentNullException(nameof(target));
76 object actual = target.GetValue(Property);
77 if (!Equals(actual, Value) && !(Value is Tizen.NUI.Binding.Binding) && !(Value is DynamicResource))
79 //Do not reset default value if the value has been changed
80 _originalValues.Remove(target);
85 if (_originalValues.TryGetValue(target, out defaultValue))
87 //reset default value, unapply bindings and dynamicResource
88 target.SetValue(Property, defaultValue, fromStyle);
89 _originalValues.Remove(target);
92 target.ClearValue(Property);