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); } }
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); }
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; }
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; }
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); }
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)); } }
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); }
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; }
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)); }
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); }
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); }
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); }
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; }
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))); }
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); }
private void DebugInfo(string message, object[] args = null) { BindingServiceProvider.DebugBinding(this, TargetAccessor.Source.Path.DebugTag, message, args); }
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); }
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); }
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); }
protected void DebugInfo(string message, object[] args = null) { BindingServiceProvider.DebugBinding(this, DebugTag, message, args); }