2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Reflection;
5 using System.Runtime.CompilerServices;
7 using Tizen.NUI.Binding.Internals;
10 namespace Tizen.NUI.Binding
12 /// <since_tizen> 6 </since_tizen>
13 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
14 [EditorBrowsable(EditorBrowsableState.Never)]
15 [ContentProperty("Value")]
16 [ProvideCompiled("Tizen.NUI.Core.XamlC.SetterValueProvider")]
17 public sealed class Setter : IValueProvider
19 readonly ConditionalWeakTable<BindableObject, object> _originalValues = new ConditionalWeakTable<BindableObject, object>();
21 /// <since_tizen> 6 </since_tizen>
22 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
23 [EditorBrowsable(EditorBrowsableState.Never)]
24 public BindableProperty Property { get; set; }
26 /// <since_tizen> 6 </since_tizen>
27 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
28 [EditorBrowsable(EditorBrowsableState.Never)]
29 public object Value { get; set; }
31 object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
35 var lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
36 IXmlLineInfo lineInfo = lineInfoProvider != null ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
37 throw new XamlParseException("Property not set", lineInfo);
39 var valueconverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider;
41 Func<MemberInfo> minforetriever =
43 (MemberInfo)Property.DeclaringType.GetRuntimeProperty(Property.PropertyName) ?? (MemberInfo)Property.DeclaringType.GetRuntimeMethod("Get" + Property.PropertyName, new[] { typeof(BindableObject) });
45 object value = valueconverter?.Convert(Value, Property.ReturnType, minforetriever, serviceProvider);
50 internal void Apply(BindableObject target, bool fromStyle = false)
53 throw new ArgumentNullException("target");
57 object originalValue = target.GetValue(Property);
58 if (!Equals(originalValue, Property.DefaultValue))
60 _originalValues.Remove(target);
61 _originalValues.Add(target, originalValue);
64 var dynamicResource = Value as DynamicResource;
65 var binding = Value as BindingBase;
67 target.SetBinding(Property, binding.Clone(), fromStyle);
68 else if (dynamicResource != null)
69 target.SetDynamicResource(Property, dynamicResource.Key, fromStyle);
72 if (Value is IList<VisualStateGroup> visualStateGroupCollection)
73 target.SetValue(Property, visualStateGroupCollection.Clone(), fromStyle);
75 target.SetValue(Property, Value, fromStyle);
79 internal void UnApply(BindableObject target, bool fromStyle = false)
82 throw new ArgumentNullException(nameof(target));
86 object actual = target.GetValue(Property);
87 if (!Equals(actual, Value) && !(Value is Tizen.NUI.Binding.Binding) && !(Value is DynamicResource))
89 //Do not reset default value if the value has been changed
90 _originalValues.Remove(target);
95 if (_originalValues.TryGetValue(target, out defaultValue))
97 //reset default value, unapply bindings and dynamicResource
98 target.SetValue(Property, defaultValue, fromStyle);
99 _originalValues.Remove(target);
102 target.ClearValue(Property);