public static void InitializeFromDesignContext()
 {
     BindingServiceProvider.InitializeFromDesignContext();
     if (!_initializedFromDesign)
     {
         _initializedFromDesign = true;
         var methodInfo = typeof(WpfDataBindingExtensions).GetMethodEx(nameof(InitializeFromDesignContextInternal),
                                                                       MemberFlags.Static | MemberFlags.NonPublic | MemberFlags.Public);
         methodInfo?.Invoke(null, null);
     }
 }
Ejemplo n.º 2
0
        public bool Load(IModuleContext context)
        {
            if (context.PlatformInfo.Platform == PlatformType.Android)
            {
                BindingServiceProvider.Initialize(errorProvider: new AndroidBindingErrorProvider(), converter: BindingConverterExtensions.Convert);
                BindingServiceProvider.BindingProvider.DefaultBehaviors.Add(DisableEqualityCheckingBehavior.TargetTrueNotTwoWay);
                BindingResourceExtensions.Initialize();
            }

            AndroidToolkitExtensions.ItemsSourceAdapterFactory = (o, ctx, arg3) => new ItemsSourceAdapter(o, ctx, !ReferenceEquals(ViewGroupItemsSourceGenerator.Context, arg3));
            context.TryRegisterDataTemplateSelectorsAndValueConverters(null);
            MugenMvvmToolkit.Binding.AttachedMembersRegistration.RegisterDefaultMembers();

            if (AndroidToolkitExtensions.IsApiGreaterThanOrEqualTo14)
            {
                var isActionBar = AndroidToolkitExtensions.IsActionBar;
                var isFragment  = AndroidToolkitExtensions.IsFragment;
                AndroidToolkitExtensions.IsActionBar = o => isActionBar(o) || o is ActionBar;
                AndroidToolkitExtensions.IsFragment  = o => isFragment(o) || o is Fragment;

                AttachedMembersRegistration.RegisterActionBarBaseMembers();
                AttachedMembersRegistration.RegisterActionBarMembers();
                AttachedMembersRegistration.RegisterActionBarTabMembers();
            }

            AttachedMembersRegistration.RegisterObjectMembers();
            AttachedMembersRegistration.RegisterViewBaseMembers();
            AttachedMembersRegistration.RegisterViewMembers();
            AttachedMembersRegistration.RegisterDialogMembers();
            AttachedMembersRegistration.RegisterActivityMembers();
            AttachedMembersRegistration.RegisterRatingBarMembers();
            AttachedMembersRegistration.RegisterAdapterViewBaseMembers();
            AttachedMembersRegistration.RegisterAdapterViewMembers();
            AttachedMembersRegistration.RegisterViewGroupMembers();
            AttachedMembersRegistration.RegisterTabHostMembers();
            AttachedMembersRegistration.RegisterTextViewMembers();
            AttachedMembersRegistration.RegisterAutoCompleteTextViewMembers();
            AttachedMembersRegistration.RegisterDatePickerMembers();
            AttachedMembersRegistration.RegisterTimePickerMembers();
            AttachedMembersRegistration.RegisterImageViewMembers();
            AttachedMembersRegistration.RegisterToolbarMembers();
            AttachedMembersRegistration.RegisterButtonMembers();
            AttachedMembersRegistration.RegisterCompoundButtonMembers();
            AttachedMembersRegistration.RegisterSeekBarMembers();
            AttachedMembersRegistration.RegisterMenuMembers();
            AttachedMembersRegistration.RegisterMenuItemBaseMembers();
            AttachedMembersRegistration.RegisterMenuItemMembers();
            AttachedMembersRegistration.RegisterPopupMenuMembers();
            AttachedMembersRegistration.RegisterMenuItemActionViewMembers();
            AttachedMembersRegistration.RegisterMenuItemActionProviderMembers();
            AttachedMembersRegistration.RegisterSearchViewMembers();
            return(true);
        }
Ejemplo n.º 3
0
 public BindingMemberInfo([NotNull] string path, [NotNull] FieldInfo field, Type sourceType)
     : this(path, BindingMemberType.Field, field.FieldType)
 {
     _member = field;
     _getValueAccessorSingle       = InitiliazeFieldGetter;
     _setValueAccessorSingleAction = InitializeFieldSetter;
     _canRead           = true;
     _canWrite          = true;
     _isSingleParameter = true;
     _memberEvent       = BindingServiceProvider.UpdateEventFinder(sourceType, field.Name);
     _canObserve        = _memberEvent != null;
 }
Ejemplo n.º 4
0
 public BindingMemberInfo([NotNull] string path, [NotNull] FieldInfo field, Type sourceType)
     : this(path, BindingMemberType.Field, field.FieldType)
 {
     _member = field;
     _getValueAccessorSingle       = ServiceProvider.ReflectionManager.GetMemberGetter <object>(field);
     _setValueAccessorSingleAction = ServiceProvider.ReflectionManager.GetMemberSetter <object>(field);
     _canRead           = true;
     _canWrite          = true;
     _isSingleParameter = true;
     _memberEvent       = BindingServiceProvider.UpdateEventFinder(sourceType, field.Name);
     _canObserve        = _memberEvent != null;
 }
Ejemplo n.º 5
0
        public bool Load(IModuleContext context)
        {
            TouchToolkitExtensions.TableViewSourceFactory      = (o, ctx) => new ItemsSourceTableViewSource(o);
            TouchToolkitExtensions.CollectionViewSourceFactory = (o, ctx) => new ItemsSourceCollectionViewSource(o);

            if (context.PlatformInfo.Platform == PlatformType.iOS)
            {
                BindingServiceProvider.Initialize(errorProvider: new TouchBindingErrorProvider(), converter: BindingConverterExtensions.Convert);
            }

            context.TryRegisterDataTemplateSelectorsAndValueConverters(null);
            MugenMvvmToolkit.Binding.AttachedMembersRegistration.RegisterDefaultMembers();

            var converter = new BooleanToCheckmarkAccessoryConverter();

            BindingServiceProvider.ResourceResolver.AddConverter("BooleanToCheckmark", converter);
            BindingServiceProvider.ResourceResolver.AddConverter("BoolToCheckmark", converter);
            BindingServiceProvider.BindingProvider.DefaultBehaviors.Add(DisableEqualityCheckingBehavior.TargetTrueNotTwoWay);

            AttachedMembersRegistration.RegisterObjectMembers();
            AttachedMembersRegistration.RegisterViewMembers();
            AttachedMembersRegistration.RegisterSegmentedControlMembers();
            AttachedMembersRegistration.RegisterButtonMembers();
            AttachedMembersRegistration.RegisterDatePickerMembers();
            AttachedMembersRegistration.RegisterSwitchMembers();
            AttachedMembersRegistration.RegisterControlMembers();
            AttachedMembersRegistration.RegisterTextFieldMembers();
            AttachedMembersRegistration.RegisterTextViewMembers();
            AttachedMembersRegistration.RegisterLabelMembers();
            AttachedMembersRegistration.RegisterBaseViewControllerMembers();
            AttachedMembersRegistration.RegisterViewControllerMembers();
            AttachedMembersRegistration.RegisterTabBarControllerMembers();
            AttachedMembersRegistration.RegisterSplitViewControllerMembers();
            AttachedMembersRegistration.RegisterToolbarMembers();
            AttachedMembersRegistration.RegisterPickerViewMembers();
            AttachedMembersRegistration.RegisterBarButtonItemMembers();
            AttachedMembersRegistration.RegisterSearchBarMembers();
            AttachedMembersRegistration.RegisterSliderMembers();
            AttachedMembersRegistration.RegisterProgressViewMembers();
            AttachedMembersRegistration.RegisterCollectionViewMembers();
            AttachedMembersRegistration.RegisterCollectionViewCellMembers();
            AttachedMembersRegistration.RegisterDialogElementMembers();
            AttachedMembersRegistration.RegisterDialogEntryElementMembers();
            AttachedMembersRegistration.RegisterStringElementMembers();
            AttachedMembersRegistration.RegisterTableViewMembers();
            AttachedMembersRegistration.RegisterTableViewCellMembers();

            return(true);
        }
Ejemplo n.º 6
0
        protected void RaiseBindingException(Exception exception, Exception originalException, BindingAction action)
        {
            BindingEventArgs args = null;
            var handler           = BindingUpdated;

            if (handler != null)
            {
                args = new BindingEventArgs(action, exception, originalException);
                handler(this, args);
            }
            if (BindingServiceProvider.BindingExceptionHandler != null)
            {
                BindingServiceProvider.RaiseBindingException(this, args ?? new BindingEventArgs(action, exception, originalException));
            }
        }
Ejemplo n.º 7
0
 private static void OnBindPropertyChanged(BindableObject bindable, object oldValue, object newValue)
 {
     var bindings = (string)newValue;
     if (string.IsNullOrWhiteSpace(bindings))
         return;
     if (ServiceProvider.IsDesignMode)
     {
         BindingServiceProvider.InitializeFromDesignContext();
         IList<IDataBinding> list = BindingServiceProvider.BindingProvider.CreateBindingsFromStringWithBindings(bindable, bindings);
         foreach (InvalidDataBinding binding in list.OfType<InvalidDataBinding>())
             throw binding.Exception;
     }
     else
         BindingServiceProvider.BindingProvider.CreateBindingsFromString(bindable, bindings);
 }
Ejemplo n.º 8
0
 protected override void OnInit()
 {
     BindingServiceProvider.SetDefaultValues();
     base.OnInit();
     if (ValueConverterEx == null)
     {
         //to invoke static constructor.
         new PlatformDataBindingModule();
         ValueConverterEx = BindingServiceProvider.ValueConverter;
     }
     else
     {
         BindingServiceProvider.ValueConverter = ValueConverterEx;
     }
     ThreadManager.ImmediateInvokeAsync           = true;
     ThreadManager.ImmediateInvokeOnUiThreadAsync = true;
     ThreadManager.ImmediateInvokeOnUiThread      = true;
 }
Ejemplo n.º 9
0
        public virtual object InvokeDynamicMethod(string methodName, IDataContext context, IList <Type> typeArgs, object[] items)
        {
            var resourceMethod = BindingServiceProvider.ResourceResolver.ResolveMethod(methodName, context, false);

            if (resourceMethod != null)
            {
                return(resourceMethod.Invoke(typeArgs, items, context));
            }

            var  binding    = context.GetData(BindingConstants.Binding);
            Type targetType = binding == null
                ? typeof(object)
                : binding.TargetAccessor.Source.GetPathMembers(false).LastMember.Type;
            var converter = BindingServiceProvider.ResourceResolver.ResolveConverter(methodName, context, true);

            return(converter.Convert(items[0], targetType, items.Length > 1 ? items[1] : null,
                                     items.Length > 2 ? (CultureInfo)items[2] : BindingServiceProvider.BindingCultureInfo(), context));
        }
Ejemplo n.º 10
0
        public bool Load(IModuleContext context)
        {
            BindingServiceProvider.Initialize(contextManager: new XamarinFormsBindingContextManager(), resourceResolver: new XamarinFormsBindingResourceResolver(),
                                              errorProvider: new XamarinFormsBindingErrorProvider(), converter: XamarinFormsDataBindingExtensions.Convert);
            context.TryRegisterDataTemplateSelectorsAndValueConverters(RegisterType);
            MugenMvvmToolkit.Binding.AttachedMembersRegistration.RegisterDefaultMembers();

            AttachedMembersRegistration.RegisterElementMembers();
            AttachedMembersRegistration.RegisterVisualElementMembers();
            AttachedMembersRegistration.RegisterToolbarItemMembers();
            AttachedMembersRegistration.RegisterEntryMembers();
            AttachedMembersRegistration.RegisterLabelMembers();
            AttachedMembersRegistration.RegisterButtonMembers();
            AttachedMembersRegistration.RegisterListViewMembers();
            AttachedMembersRegistration.RegisterProgressBarMembers();

            ServiceProvider.Initialized += OnAppInitialized;
            return(true);
        }
Ejemplo n.º 11
0
        internal static object Convert(IBindingMemberInfo member, Type type, object value)
        {
            if (value == null)
            {
                return(type.GetDefaultValue());
            }
            if (type.IsInstanceOfType(value))
            {
                return(value);
            }
#if NET_STANDARD
            if (type.GetTypeInfo().IsEnum)
#else
            if (type.IsEnum)
#endif
            {
                var s = value as string;
                if (s == null)
                {
                    return(Enum.ToObject(type, value));
                }
                return(Enum.Parse(type, s, false));
            }
#if WPF || ANDROID || TOUCH || WINFORMS || WINDOWS_PHONE
            var converter = GetTypeConverter(type, member.Member);
            if (converter != null && converter.CanConvertFrom(value.GetType()))
            {
                return(converter.ConvertFrom(value));
            }
#endif
#if NET_STANDARD
            if (TypeCodeTable.ContainsKey(value.GetType()))
#else
            if (value is IConvertible)
#endif
            { return(System.Convert.ChangeType(value, type.GetNonNullableType(), BindingServiceProvider.BindingCultureInfo())); }
            if (type == typeof(string))
            {
                return(value.ToString());
            }
            return(value);
        }
Ejemplo n.º 12
0
        internal static object Convert(IBindingMemberInfo member, Type type, object value)
        {
            if (value == null)
            {
                if (type.IsValueType() && !type.IsNullableType())
                {
                    return(Activator.CreateInstance(type));
                }
                return(null);
            }
            if (type.IsInstanceOfType(value))
            {
                return(value);
            }
#if PCL_WINRT
            if (type.GetTypeInfo().IsEnum&& value is string)
#else
            if (type.IsEnum && value is string)
#endif
            { return(Enum.Parse(type, (string)value, false)); }
#if WPF || ANDROID || TOUCH || WINFORMS || WINDOWS_PHONE || SILVERLIGHT
            var converter = GetTypeConverter(type, member.Member);
            if (converter != null && converter.CanConvertFrom(value.GetType()))
            {
                return(converter.ConvertFrom(value));
            }
#endif
#if PCL_WINRT
            if (TypeCodeTable.ContainsKey(value.GetType()))
#else
            if (value is IConvertible)
#endif
            { return(System.Convert.ChangeType(value, type.GetNonNullableType(), BindingServiceProvider.BindingCultureInfo())); }
            if (type == typeof(string))
            {
                return(value.ToString());
            }
            return(value);
        }
Ejemplo n.º 13
0
        protected override void OnInit()
        {
            BindingServiceProvider.SetDefaultValues();
            BindingServiceProvider.ValueConverter = BindingConverterExtensions.Convert;
            base.OnInit();
            if (ValueConverterEx == null)
            {
                //to invoke static constructor.
#if NETFX_CORE
                new UwpDataBindingModule();
#else
                new WpfDataBindingModule();
#endif
                ValueConverterEx = BindingServiceProvider.ValueConverter;
            }
            else
            {
                BindingServiceProvider.ValueConverter = ValueConverterEx;
            }
            ThreadManager.ImmediateInvokeAsync           = true;
            ThreadManager.ImmediateInvokeOnUiThreadAsync = true;
            ThreadManager.ImmediateInvokeOnUiThread      = true;
        }
Ejemplo n.º 14
0
        private IExpressionNode VisitExpression(IExpressionNode node)
        {
            if (_nodes == null)
            {
                _nodes = new List <IExpressionNode>();
            }
            else
            {
                _nodes.Clear();
            }

            string memberName = node.TryGetMemberName(true, true, _nodes);

            if (memberName == null)
            {
                _isMulti = true;
                return(node);
            }
            if (_nodes[0] is ResourceExpressionNode)
            {
                return(GetResourceMember(node, memberName, _nodes));
            }

            IBindingPath path = BindingServiceProvider.BindingPathFactory(memberName);

            if (path.IsEmpty)
            {
                return(GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i)));
            }
            string firstMember = path.Parts[0];

            if (_lamdaParameters.Contains(firstMember))
            {
                return(node);
            }
            return(GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i)));
        }
Ejemplo n.º 15
0
        protected virtual IBindingMemberInfo GetExplicitBindingMember([NotNull] Type sourceType, [NotNull] string path)
        {
            path = path.Trim();
            string[] indexerArgs = null;
            if (path.StartsWith("[", StringComparison.Ordinal) && path.EndsWith("]", StringComparison.Ordinal))
            {
                indexerArgs = path
                              .RemoveBounds()
                              .Split(BindingReflectionExtensions.CommaSeparator, StringSplitOptions.RemoveEmptyEntries);
            }

            var types = BindingReflectionExtensions.SelfAndBaseTypes(sourceType);

            foreach (var type in types)
            {
                if (indexerArgs == null)
                {
                    PropertyInfo property = type.GetPropertyEx(path, PropertyFlags);
                    if (property != null)
                    {
                        return(new BindingMemberInfo(path, property, sourceType));
                    }
                }
                else
                {
                    PropertyInfo candidate      = null;
                    int          valueTypeCount = -1;
                    foreach (var property in type.GetPropertiesEx(PropertyFlags))
                    {
                        var indexParameters = property.GetIndexParameters();
                        if (indexParameters.Length != indexerArgs.Length)
                        {
                            continue;
                        }
                        try
                        {
                            int count = 0;
                            for (int i = 0; i < indexParameters.Length; i++)
                            {
                                var arg       = indexerArgs[i];
                                var paramType = indexParameters[i].ParameterType;
                                if (arg.StartsWith("\"", StringComparison.Ordinal) && arg.EndsWith("\"", StringComparison.Ordinal))
                                {
                                    if (paramType != typeof(string))
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    BindingServiceProvider.ValueConverter(Empty, paramType, arg);
                                    if (paramType.IsValueType())
                                    {
                                        count++;
                                    }
                                }
                            }
                            if (valueTypeCount < count)
                            {
                                candidate      = property;
                                valueTypeCount = count;
                            }
                        }
                        catch
                        {
                            ;
                        }
                    }
                    if (candidate != null)
                    {
                        return(new BindingMemberInfo(path, candidate, sourceType));
                    }
                    if (type.IsArray && type.GetArrayRank() == indexerArgs.Length)
                    {
                        return(new BindingMemberInfo(path, type));
                    }
                }
                EventInfo @event = type.GetEventEx(path, EventFlags);
                if (@event != null)
                {
                    return(new BindingMemberInfo(path, @event, null));
                }

                FieldInfo field = type.GetFieldEx(path, FieldFlags);
                if (field != null)
                {
                    return(new BindingMemberInfo(path, field, sourceType));
                }
            }

            if (typeof(IDynamicObject).IsAssignableFrom(sourceType))
            {
                return(new BindingMemberInfo(path, false));
            }
            if (typeof(ExpandoObject).IsAssignableFrom(sourceType))
            {
                return(new BindingMemberInfo(path, true));
            }


            if (path.EndsWith(AttachedMemberConstants.ChangedEventPostfix, StringComparison.Ordinal))
            {
                var memberName = path.Substring(0, path.Length - 7);
                var member     = GetBindingMember(sourceType, memberName, false, false);
                if (member != null && member.CanObserve)
                {
                    return(new BindingMemberInfo(path, null, member));
                }
            }
            return(null);
        }
Ejemplo n.º 16
0
 private void DebugInfo(string message, object[] args = null)
 {
     BindingServiceProvider.DebugBinding(this, TargetAccessor.Source.Path.DebugTag, message, args);
 }
Ejemplo n.º 17
0
        private object GetSourceValue(IBindingMemberInfo targetMember, IDataContext context, bool throwOnError)
        {
            var    isDebuggable = IsDebuggable;
            object value        = GetRawValueInternal(targetMember, context, throwOnError);

            if (isDebuggable)
            {
                DebugInfo($"Got a source value: '{value}'");
            }
            if (value.IsDoNothing())
            {
                return(BindingConstants.DoNothing);
            }

            if (_parameters.ConverterDelegate != null && !value.IsUnsetValue())
            {
                IBindingValueConverter converter = _parameters.ConverterDelegate(context);
                if (converter != null)
                {
                    CultureInfo culture   = _parameters.ConverterCultureDelegate?.Invoke(context) ?? BindingServiceProvider.BindingCultureInfo();
                    object      parameter = _parameters.ConverterParameterDelegate?.Invoke(context);
                    if (isDebuggable)
                    {
                        DebugInfo($"Applying converter for source value: '{value}', converter: '{converter}', parameter: '{parameter}', culture: {culture}, target type: '{targetMember.Type}'");
                        value = converter.Convert(value, targetMember.Type, parameter, culture, context);
                        DebugInfo($"Converter '{converter}' returns value: '{value}'");
                    }
                    else
                    {
                        value = converter.Convert(value, targetMember.Type, parameter, culture, context);
                    }
                }
            }
            if (value.IsUnsetValue())
            {
                value = _parameters.FallbackDelegate?.Invoke(context) ?? targetMember.Type.GetDefaultValue();
            }
            if (value == null)
            {
                return(_parameters.TargetNullValue);
            }
            return(value);
        }
Ejemplo n.º 18
0
 protected void DebugInfo(string message, object[] args = null)
 {
     BindingServiceProvider.DebugBinding(this, Path.DebugTag, $"(Path='{Path.Path}') {message}", args);
 }
        protected override bool SetValueInternal(IBindingSourceAccessor targetAccessor, IDataContext context,
                                                 bool throwOnError)
        {
            IBindingPathMembers members = _bindingSource.GetPathMembers(throwOnError);

            if (!members.AllMembersAvailable)
            {
                return(false);
            }

            object             penultimateValue = members.PenultimateValue;
            IBindingMemberInfo lastMember       = members.LastMember;

            object oldValue;
            object newValue = targetAccessor.GetValue(lastMember, context, throwOnError);

            if (lastMember.CanRead && !BindingMemberType.BindingContext.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                oldValue = lastMember.GetValue(penultimateValue, null);
                if (ReferenceEquals(oldValue, newValue) || newValue.IsUnsetValueOrDoNothing())
                {
                    return(false);
                }
            }
            else
            {
                oldValue = BindingConstants.UnsetValue;
                if (newValue.IsUnsetValueOrDoNothing())
                {
                    return(false);
                }
            }

            ValueAccessorChangingEventArgs args = null;

            if (ValueChanging != null)
            {
                args = RaiseValueChanging(context, penultimateValue, lastMember, oldValue, newValue);
                if (args != null)
                {
                    if (args.Cancel)
                    {
                        return(false);
                    }
                    if (!ReferenceEquals(newValue, args.NewValue))
                    {
                        newValue = args.NewValue;
                        if (newValue.IsUnsetValueOrDoNothing())
                        {
                            return(false);
                        }
                    }
                }
            }
            newValue = BindingServiceProvider.ValueConverter(lastMember, lastMember.Type, newValue);
            if (Equals(oldValue, newValue))
            {
                return(false);
            }
            if (BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                TryRegisterEvent((BindingActionValue)oldValue, newValue, context);
                RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
            }
            else
            {
                if (_closure != null)
                {
                    _closure.Unsubscribe(false, _isOneTime);
                }
                lastMember.SetSingleValue(penultimateValue, newValue);
                if (ValueChanged != null)
                {
                    RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
                }
            }
            return(true);
        }
Ejemplo n.º 20
0
        private object GetTargetValue(IBindingMemberInfo targetMember, IDataContext context, bool throwOnError)
        {
            var    isDebuggable = IsDebuggable;
            object value        = GetRawValueInternal(targetMember, context, throwOnError);

            if (isDebuggable)
            {
                DebugInfo($"Got a target value: '{value}'");
            }
            if (value.IsUnsetValueOrDoNothing())
            {
                return(value);
            }

            IBindingValueConverter converter = _parameters.ConverterDelegate?.Invoke(context);

            if (converter != null)
            {
                CultureInfo culture   = _parameters.ConverterCultureDelegate?.Invoke(context) ?? BindingServiceProvider.BindingCultureInfo();
                object      parameter = _parameters.ConverterParameterDelegate?.Invoke(context);
                if (isDebuggable)
                {
                    DebugInfo($"Applying converter for target value: '{value}', converter: '{converter}', parameter: '{parameter}', culture: {culture}, target type: '{targetMember.Type}'");
                    value = converter.ConvertBack(value, targetMember.Type, parameter, culture, context);
                    DebugInfo($"Converter '{converter}' returns value: '{value}'");
                }
                else
                {
                    value = converter.ConvertBack(value, targetMember.Type, parameter, culture, context);
                }
            }

            if (Equals(value, _parameters.TargetNullValue))
            {
                if (isDebuggable)
                {
                    DebugInfo("Target value equals to TargetNullValue, return null value");
                }
                return(null);
            }
            return(value);
        }
 private void DebugInfo(string message, object[] args = null)
 {
     BindingServiceProvider.DebugBinding(this, _path.DebugTag, message, args);
 }
        private object GetTargetValue(IBindingMemberInfo targetMember, IDataContext context, bool throwOnError)
        {
            object value = GetRawValueInternal(targetMember, context, throwOnError);

            if (value.IsUnsetValueOrDoNothing())
            {
                return(value);
            }
            if (_parameters.ConverterDelegate != null)
            {
                IBindingValueConverter converter = _parameters.ConverterDelegate(context);
                if (converter != null)
                {
                    CultureInfo culture   = _parameters.ConverterCultureDelegate.GetValueOrDefault(context, BindingServiceProvider.BindingCultureInfo());
                    object      parameter = _parameters.ConverterParameterDelegate.GetValueOrDefault(context);
                    value = converter.ConvertBack(value, targetMember.Type, parameter, culture, context);
                }
            }
            if (Equals(value, _parameters.TargetNullValue))
            {
                return(null);
            }
            return(value);
        }
        private object GetSourceValue(IBindingMemberInfo targetMember, IDataContext context, bool throwOnError)
        {
            object value = GetRawValueInternal(targetMember, context, throwOnError);

            if (value.IsDoNothing())
            {
                return(BindingConstants.DoNothing);
            }
            if (_parameters.ConverterDelegate != null && !value.IsUnsetValue())
            {
                IBindingValueConverter converter = _parameters.ConverterDelegate(context);
                if (converter != null)
                {
                    CultureInfo culture   = _parameters.ConverterCultureDelegate.GetValueOrDefault(context, BindingServiceProvider.BindingCultureInfo());
                    object      parameter = _parameters.ConverterParameterDelegate.GetValueOrDefault(context);
                    value = converter.Convert(value, targetMember.Type, parameter, culture, context);
                }
            }
            if (value.IsUnsetValue())
            {
                value = _parameters.FallbackDelegate.GetValueOrDefault(context) ?? targetMember.Type.GetDefaultValue();
            }
            if (value == null)
            {
                return(_parameters.TargetNullValue);
            }
            return(value);
        }
        protected override bool SetValueInternal(IBindingSourceAccessor targetAccessor, IDataContext context,
                                                 bool throwOnError)
        {
            IBindingPathMembers members = _bindingSource.GetPathMembers(throwOnError);
            object penultimateValue     = members.PenultimateValue;

            if (penultimateValue.IsUnsetValue() || (penultimateValue == null && !members.AllMembersAvailable))
            {
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding cannot set value for path {members.Path.Path}", new object[] { members });
                }
                return(false);
            }

            IBindingMemberInfo lastMember = members.LastMember;
            object             oldValue;
            object             newValue = targetAccessor.GetValue(lastMember, context, throwOnError);

            if (lastMember.CanRead && !BindingMemberType.BindingContext.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                if (_disableEqualityChecking && !BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
                {
                    oldValue = BindingConstants.UnsetValue;
                }
                else
                {
                    oldValue = lastMember.GetValue(penultimateValue, null);
                }
                if (ReferenceEquals(oldValue, newValue) || newValue.IsUnsetValueOrDoNothing())
                {
                    if (members.Path.IsDebuggable)
                    {
                        DebugInfo($"Binding ignores setter because old value: '{oldValue}' equals to new value '{newValue}'", new[] { members, oldValue, newValue });
                    }
                    return(false);
                }
            }
            else
            {
                oldValue = BindingConstants.UnsetValue;
                if (newValue.IsUnsetValueOrDoNothing())
                {
                    if (members.Path.IsDebuggable)
                    {
                        DebugInfo($"Binding ignores setter for value '{newValue}'", new[] { members, newValue });
                    }
                    return(false);
                }
            }

            ValueAccessorChangingEventArgs args = null;

            if (ValueChanging != null)
            {
                args = RaiseValueChanging(context, penultimateValue, lastMember, oldValue, newValue);
                if (args != null)
                {
                    if (args.Cancel)
                    {
                        return(false);
                    }
                    if (!ReferenceEquals(newValue, args.NewValue))
                    {
                        newValue = args.NewValue;
                        if (newValue.IsUnsetValueOrDoNothing())
                        {
                            if (members.Path.IsDebuggable)
                            {
                                DebugInfo($"Binding ignores setter for value '{newValue}'", new[] { members, newValue });
                            }
                            return(false);
                        }
                    }
                }
            }
            newValue = BindingServiceProvider.ValueConverter(lastMember, lastMember.Type, newValue);
            if (Equals(oldValue, newValue))
            {
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding ignores setter because old value: '{oldValue}' equals to new value '{newValue}'", new[] { members, oldValue, newValue });
                }
                return(false);
            }
            if (BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                TryRegisterEvent((BindingActionValue)oldValue, newValue, context, members);
                RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
            }
            else
            {
                _closure?.Unsubscribe(false, _isOneTime);
                lastMember.SetSingleValue(penultimateValue, newValue);
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding set value: '{newValue}' for source: '{penultimateValue}' with path: '{lastMember.Path}'", new[] { newValue, penultimateValue, lastMember });
                }
                if (ValueChanged != null)
                {
                    RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
                }
            }
            return(true);
        }
Ejemplo n.º 25
0
 protected void DebugInfo(string message, object[] args = null)
 {
     BindingServiceProvider.DebugBinding(this, DebugTag, message, args);
 }