internal static Exception DuplicateBindingRegistration(IDataBinding binding)
 {
     return
         (new InvalidOperationException(
              string.Format("The binding '{0}' has already been registered, dual registration is not possible.",
                            binding)));
 }
 private static void BindingExceptionHandlerImpl(IDataBinding dataBinding, BindingEventArgs bindingEventArgs)
 {
     if (bindingEventArgs.Exception != null)
     {
         Tracer.Error(bindingEventArgs.Exception.Message);
     }
 }
 public void Register(object target, string path, IDataBinding binding, IDataContext context = null)
 {
     _bindingManager.Register(target, path, binding, context);
     lock (_bindings)
         _bindings.Add(new WeakReference(binding, true));
     ++BindingCount;
 }
Example #4
0
        internal static Exception WrapBindingException(IDataBinding binding, BindingAction action, Exception exception)
        {
            string message =
                $"A binding error has occurred, when update {(action == BindingAction.UpdateSource ? "source" : "target")}, path '{binding.TargetAccessor.Source.Path}', inner exception '{exception.Message}'";

            return(new InvalidOperationException(message, exception));
        }
Example #5
0
 public bool Attach(IDataBinding binding)
 {
     if (Interlocked.Exchange(ref _state, Attaching) != Available)
     {
         throw BindingExceptionManager.BehaviorInitialized(this);
     }
     try
     {
         _binding = binding;
         if (OnAttached())
         {
             _state = Attached;
             return(true);
         }
         _state   = Available;
         _binding = null;
         return(false);
     }
     catch (Exception)
     {
         _state   = Available;
         _binding = null;
         throw;
     }
 }
Example #6
0
 /// <summary>
 ///     Creates a series of instances of <see cref="IDataBinding" />.
 /// </summary>
 /// <param name="target">The specified binding target.</param>
 /// <param name="bindingExpression">The specified binding expression.</param>
 /// <param name="sources">The specified sources, if any.</param>
 /// <returns>An instance of <see cref="IDataBinding" />.</returns>
 public IList <IDataBinding> CreateBindingsFromString(object target, string bindingExpression, IList <object> sources = null)
 {
     Should.NotBeNull(target, "target");
     Should.NotBeNullOrWhitespace(bindingExpression, "bindingExpression");
     try
     {
         IList <IDataContext> parserResult = Parser.Parse(bindingExpression, (sources == null || sources.Count == 0)
             ? DataContext.Empty
             : new DataContext(1)
         {
             { BindingBuilderConstants.RawSources, sources }
         });
         var result = new IDataBinding[parserResult.Count];
         for (int index = 0; index < parserResult.Count; index++)
         {
             IDataContext dataContext = parserResult[index];
             dataContext.Add(BindingBuilderConstants.Target, target);
             result[index] = BuildBinding(dataContext);
         }
         return(result);
     }
     catch (Exception exception)
     {
         return(new[]
         {
             CreateInvalidDataBinding(new InvalidOperationException(exception.Message, exception))
         });
     }
 }
 public bool Attach(IDataBinding binding)
 {
     if (BindingServiceProvider.ErrorProvider == null)
         return false;
     binding.BindingUpdated += BindingUpdatedDelegate;
     return true;
 }
Example #8
0
        public virtual void Register(object target, string path, IDataBinding binding, IDataContext context = null)
        {
            Should.NotBeNull(target, nameof(target));
            Should.NotBeNull(path, nameof(path));
            Should.NotBeNull(binding, nameof(binding));
            var dataBinding = binding as DataBinding;

            if (dataBinding == null)
            {
                if (ServiceProvider.AttachedValueProvider.GetValue <object>(binding, IsRegisteredMember, false) != null)
                {
                    throw BindingExceptionManager.DuplicateBindingRegistration(binding);
                }
                ServiceProvider.AttachedValueProvider.SetValue(binding, IsRegisteredMember, Empty.TrueObject);
            }
            else
            {
                if (dataBinding.IsAssociated)
                {
                    throw BindingExceptionManager.DuplicateBindingRegistration(binding);
                }
                dataBinding.IsAssociated = true;
            }
            ServiceProvider
            .AttachedValueProvider
            .AddOrUpdate(target, BindPrefix + path, binding, UpdateValueFactoryDelegate);
        }
Example #9
0
        protected IDataBinding BuildBinding([NotNull] IDataContext context)
        {
            try
            {
                var handler = BindingInitializing;
                if (handler != null)
                {
                    handler(this, context);
                }

                object       target;
                IBindingPath targetPath;
                IDataBinding binding = CreateBinding(context, out target, out targetPath);
                if (!binding.IsDisposed)
                {
                    BindingServiceProvider.BindingManager.Register(target, targetPath.Path, binding, context);
                }

                var initialized = BindingInitialized;
                if (initialized != null)
                {
                    initialized(this, binding);
                }
                return(binding);
            }
            catch (Exception exception)
            {
                return(CreateInvalidDataBinding(new InvalidOperationException(exception.Message, exception)));
            }
        }
        internal static Exception WrapBindingException(IDataBinding binding, BindingAction action, Exception exception)
        {
            var    sourcePaths = string.Join(", ", binding.SourceAccessor.Sources.Select(observer => observer.Path));
            string message     =
                $"A binding error has occurred, when update {(action == BindingAction.UpdateSource ? "source" : "target")}, target '{binding.TargetAccessor.Source.Path}', source {sourcePaths}, inner exception '{exception.Message}'";

            return(new InvalidOperationException(message, exception));
        }
Example #11
0
 public void AddBinding(IDataBinding binding)
 {
     lock (_lockBindings)
     {
         _openBindings.Add(binding);
         _bindings.Add(binding);
     }
 }
 public virtual bool IsRegistered(IDataBinding binding)
 {
     Should.NotBeNull(binding, "binding");
     var dataBinding = binding as DataBinding;
     if (dataBinding == null)
         return ServiceProvider.AttachedValueProvider.GetValue<object>(binding, IsRegisteredMember, false) != null;
     return dataBinding.IsAssociated;
 }
 private void OnBindingException(IDataBinding sender, BindingExceptionEventArgs args)
 {
     UpdateErrors(new object[]
     {
         ValidatesOnExceptionsBehavior.ShowOriginalException
             ? args.OriginalException.Message
             : args.Exception.Message
     }, null);
 }
Example #14
0
 public bool Attach(IDataBinding binding)
 {
     if (BindingServiceProvider.ErrorProvider == null)
     {
         return(false);
     }
     binding.BindingUpdated += BindingUpdatedDelegate;
     return(true);
 }
        public static IDataBinding ResolvePath(
            this IDataBinding dataContext,
            string pathString
            )
        {
            Path path = new Path(pathString);

            return(dataContext.ResolvePath(path));
        }
        private static void OnBindingUpdated(IDataBinding sender, BindingEventArgs args)
        {
            IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;

            if (errorProvider != null)
            {
                SetErrors(errorProvider, sender, Empty.Array <object>());
            }
        }
Example #17
0
        private void OneTimeTargetHandler(IObserver sender, ValueChangedEventArgs args)
        {
            IDataBinding binding = Binding;

            if (binding != null && binding.TargetAccessor.IsAllMembersAvailable() && binding.SourceAccessor.IsAllMembersAvailable())
            {
                binding.TargetAccessor.Source.ValueChanged -= OneTimeTargetHandler;
                binding.UpdateTarget();
            }
        }
        private static void OnBindingException(IDataBinding sender, BindingExceptionEventArgs args)
        {
            IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;

            if (errorProvider != null)
            {
                SetErrors(errorProvider, sender,
                          new object[] { ShowOriginalException?args.OriginalException.Message: args.Exception.Message });
            }
        }
        private static void SetErrors(IBindingErrorProvider errorProvider, IDataBinding sender, object[] errors)
        {
            IBindingPathMembers pathMembers = sender.TargetAccessor.Source.GetPathMembers(false);
            object target = pathMembers.PenultimateValue;

            if (target != null && !target.IsUnsetValue())
            {
                errorProvider.SetErrors(target, Key + pathMembers.Path.Path, errors, sender.Context);
            }
        }
Example #20
0
        private void OneTimeSourceHandler(IObserver sender, ValueChangedEventArgs args)
        {
            IDataBinding binding = Binding;

            if (binding != null && binding.TargetAccessor.IsAllMembersAvailable() && binding.SourceAccessor.IsAllMembersAvailable(true))
            {
                UnsubscribeSources(OneTimeSourceHandler);
                binding.UpdateSource();
            }
        }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var target = serviceProvider.GetService <IProvideValueTarget>();

            if (target == null)
            {
                return(GetEmptyValue());
            }
            var targetObject   = target.TargetObject;
            var targetProperty = target.TargetProperty;

            if (targetObject == null || targetProperty == null)
            {
                return(GetEmptyValue());
            }
            if (!(targetObject is DependencyObject))
            {
                var type = targetObject.GetType();
                if (_sharedDpType == type || "System.Windows.SharedDp".Equals(type.FullName))
                {
                    if (_sharedDpType == null)
                    {
                        _sharedDpType = type;
                    }
                    return(this);
                }
            }
#if WPF
            if (targetObject is Setter || targetObject is DataTrigger || targetObject is Condition)
#else
            if (targetObject is Setter)
#endif
            { return(this); }

            if (_targetMemberName == string.Empty)
            {
                _targetMemberName = GetMemberName(targetObject, targetProperty);
            }
            if (_targetMemberName == null)
            {
                return(GetEmptyValue());
            }

            var          isDesignMode = ServiceProvider.IsDesignMode;
            IDataBinding binding      = HasValue
                ? CreateBindingBuilder(targetObject, _targetMemberName).Build()
                : CreateBinding(targetObject, _targetMemberName, isDesignMode);

            if (isDesignMode && binding is InvalidDataBinding)
            {
                var exception = ((InvalidDataBinding)binding).Exception;
                throw new InvalidOperationException(exception.Flatten(true), exception);
            }
            return(GetDefaultValue(targetObject, targetProperty, binding, _targetMemberName));
        }
Example #22
0
        public virtual void Unregister(IDataBinding binding)
        {
            Should.NotBeNull(binding, nameof(binding));
            object source = binding.TargetAccessor.Source.GetActualSource(false);
            string path   = binding.TargetAccessor.Source.Path.Path;

            if (source != null && path != null)
            {
                ClearBindings(source, path);
            }
        }
Example #23
0
        public virtual bool IsRegistered(IDataBinding binding)
        {
            Should.NotBeNull(binding, nameof(binding));
            var dataBinding = binding as DataBinding;

            if (dataBinding == null)
            {
                return(ServiceProvider.AttachedValueProvider.GetValue <object>(binding, IsRegisteredMember, false) != null);
            }
            return(dataBinding.IsAssociated);
        }
Example #24
0
        public static T GetOrAddValue <T>(IDataBinding binding, DataConstant <object> constant, Func <T> getValue)
        {
            object data;

            if (!binding.Context.TryGetData(constant, out data))
            {
                data = getValue();
                binding.Context.AddOrUpdate(constant, data);
            }
            return((T)data);
        }
        public void Detach(IDataBinding binding)
        {
            binding.BindingUpdated -= BindingUpdatedDelegate;
            var errorProvider = BindingServiceProvider.ErrorProvider;
            if (errorProvider == null)
                return;

            var context = new DataContext(binding.Context);
            context.AddOrUpdate(BindingConstants.ClearErrors, true);
            SetErrors(errorProvider, binding, Empty.Array<object>(), context);
        }
        /// <summary>
        /// Walks tree of bound properties upwards towards the root.
        /// Returns the absolute datapath of this binding.
        /// </summary>
        /// <param name="dataContext"></param>
        /// <returns></returns>
        public static Path GetAbsoluteBindingPath(this IDataBinding dataContext)
        {
            Path         path    = new Path();
            IDataBinding current = dataContext;

            while (current != null)
            {
                path.PathElements.AddFirst(current.LocalPath);
                current = current.Parent;
            }
            return(path);
        }
 private void SetDefaultValue(IDataBinding dataBinding)
 {
     var singleAccessor = dataBinding.SourceAccessor as ISingleBindingSourceAccessor;
     if (singleAccessor == null)
     {
         var sources = dataBinding.SourceAccessor.Sources;
         for (int index = 0; index < sources.Count; index++)
             SetDefaultValue(sources[index]);
     }
     else
         SetDefaultValue(singleAccessor.Source);
 }
        // THIS IS IGNORING GLOBAL FLAGS
        public static IDataBinding ResolvePath(
            this IDataBinding dataContext,
            Path path
            )
        {
            IDataBinding current = dataContext;

            foreach (PathElement pe in path.PathElements)
            {
                current = current.Step(pe);
            }
            return(current);
        }
        private void OneTimeHandler(IBindingSource sender, ValueChangedEventArgs args)
        {
            IDataBinding binding = Binding;

            if (binding == null || !IsSourceAvailable() || !binding.UpdateTarget())
            {
                return;
            }
            UnsubscribeSources(OneTimeHandler);
            if (_disposeBinding)
            {
                binding.Dispose();
            }
        }
Example #30
0
        private static void ClearBinding(IDataBinding binding)
        {
            binding.Dispose();
            var dataBinding = binding as DataBinding;

            if (dataBinding == null)
            {
                ServiceProvider.AttachedValueProvider.Clear(binding, IsRegisteredMember);
            }
            else
            {
                dataBinding.IsAssociated = false;
            }
        }
 /// <summary>
 ///     Detaches this instance from its associated binding.
 /// </summary>
 public void Detach(IDataBinding binding)
 {
     if (_state == Available)
         return;
     try
     {
         OnDetached();
     }
     finally
     {
         _state = Available;
         _binding = null;
     }
 }
Example #32
0
    public static void Init(IDataBinding dataBinding)
    {
        var a = new ExternalInput <string>();
        var b = a.Select(v => v.Length).Select(v => (double)v).Average();
        var r = b.Select(v => "(" + v + ")");
        var z = r.Select(v => (long)v.Length).Sum();
        var c = r.Count();
        var x = a.Where(v => v.StartsWith("a")).Distinct();

        dataBinding.Set(a, "a");
        dataBinding.Set(b, "b");
        dataBinding.Set(x, "x");
        dataBinding.Set(z, "z");
        dataBinding.Set(c, "c");
    }
Example #33
0
        public void Detach(IDataBinding binding)
        {
            binding.BindingUpdated -= BindingUpdatedDelegate;
            var errorProvider = BindingServiceProvider.ErrorProvider;

            if (errorProvider == null)
            {
                return;
            }

            var context = new DataContext(binding.Context);

            context.AddOrUpdate(BindingConstants.ClearErrors, true);
            SetErrors(errorProvider, binding, Empty.Array <object>(), context);
        }
Example #34
0
 /// <summary>
 ///     Builds an instance of <see cref="IDataBinding" />.
 /// </summary>
 /// <returns>
 ///     The builded <see cref="IDataBinding" />.
 /// </returns>
 protected IDataBinding BuildBinding([NotNull] IDataContext context)
 {
     try
     {
         object       target;
         IBindingPath targetPath;
         IDataBinding binding = CreateBinding(context, out target, out targetPath);
         BindingServiceProvider.BindingManager.Register(target, targetPath.Path, binding);
         return(binding);
     }
     catch (Exception exception)
     {
         return(CreateInvalidDataBinding(new InvalidOperationException(exception.Message, exception)));
     }
 }
Example #35
0
 public bool Attach(IDataBinding binding)
 {
     if (_checkTwoWay && binding.Behaviors.Any(behavior => behavior is TwoWayBindingMode))
     {
         return(false);
     }
     if (_isTarget)
     {
         binding.TargetAccessor.DisableEqualityChecking = _value;
     }
     else
     {
         binding.SourceAccessor.DisableEqualityChecking = _value;
     }
     return(false);
 }
 public virtual void Register(object target, string path, IDataBinding binding, IDataContext context = null)
 {
     Should.NotBeNull(target, "target");
     Should.NotBeNull(path, "path");
     Should.NotBeNull(binding, "binding");
     var dataBinding = binding as DataBinding;
     if (dataBinding == null)
     {
         if (ServiceProvider.AttachedValueProvider.GetValue<object>(binding, IsRegisteredMember, false) != null)
             throw BindingExceptionManager.DuplicateBindingRegistration(binding);
         ServiceProvider.AttachedValueProvider.SetValue(binding, IsRegisteredMember, Empty.TrueObject);
     }
     else
     {
         if (dataBinding.IsAssociated)
             throw BindingExceptionManager.DuplicateBindingRegistration(binding);
         dataBinding.IsAssociated = true;
     }
     ServiceProvider
         .AttachedValueProvider
         .AddOrUpdate(target, BindPrefix + path, binding, UpdateValueFactoryDelegate);
 }
 /// <summary>
 ///     Attaches to the specified binding.
 /// </summary>
 /// <param name="binding">The binding to attach to.</param>
 public bool Attach(IDataBinding binding)
 {
     if (Interlocked.Exchange(ref _state, Attaching) != Available)
         throw BindingExceptionManager.BehaviorInitialized(this);
     try
     {
         _binding = binding;
         if (OnAttached())
         {
             _state = Attached;
             return true;
         }
         _state = Available;
         _binding = null;
         return false;
     }
     catch (Exception)
     {
         _state = Available;
         _binding = null;
         throw;
     }
 }
        protected virtual void AddBehaviors(IDataBinding binding, IDataContext context)
        {
            List<IBindingBehavior> behaviors = context.GetData(BindingBuilderConstants.Behaviors);
            if (behaviors == null || behaviors.Count == 0)
            {
                for (int index = 0; index < _defaultBehaviors.Count; index++)
                    binding.Behaviors.Add(_defaultBehaviors[index].Clone());
                return;
            }

            int count = behaviors.Count;
            for (int index = 0; index < _defaultBehaviors.Count; index++)
            {
                IBindingBehavior behavior = _defaultBehaviors[index];
                bool hasBehavior = false;
                for (int i = 0; i < count; i++)
                {
                    if (behaviors[i].Id == behavior.Id)
                    {
                        hasBehavior = true;
                        break;
                    }
                }
                if (!hasBehavior)
                    behaviors.Add(behavior.Clone());
            }
            behaviors.Sort(BehaviorComparer);
            for (int index = 0; index < behaviors.Count; index++)
                binding.Behaviors.Add(behaviors[index]);
        }
        protected virtual object GetDefaultValue(object targetObject, object targetProperty, IDataBinding binding, string targetPath)
        {
#if WPF
            var dp = targetProperty as DependencyProperty;
            if (dp != null)
                return ((DependencyObject)targetObject).GetValue(dp);
#endif
            var eventInfo = targetProperty as EventInfo;
            if (eventInfo != null)
                return CreateDelegateForEvent(eventInfo);

            if (_targetMemberInfo == null)
                _targetMemberInfo = BindingServiceProvider
                    .MemberProvider
                    .GetBindingMember(targetObject.GetType(), targetPath, false, false);
            if (_targetMemberInfo == null)
                return GetEmptyValue();
#if WPF
            eventInfo = _targetMemberInfo.Member as EventInfo;
            if (eventInfo != null)
                return CreateDelegateForEvent(eventInfo);
#endif
            return _targetMemberInfo.GetValue(targetObject, null);
        }
 public void Unregister(IDataBinding binding)
 {
     _bindingManager.Unregister(binding);
 }
 bool IBindingBehavior.Attach(IDataBinding binding)
 {
     return Attach(binding);
 }
 public bool Attach(IDataBinding binding)
 {
     if (_checkTwoWay && binding.Behaviors.Any(behavior => behavior is TwoWayBindingMode))
         return false;
     if (_isTarget)
         binding.TargetAccessor.DisableEqualityChecking = _value;
     else
         binding.SourceAccessor.DisableEqualityChecking = _value;
     return false;
 }
 private static void SetErrors(IBindingErrorProvider errorProvider, IDataBinding sender, object[] errors, IDataContext context)
 {
     IBindingPathMembers pathMembers = sender.TargetAccessor.Source.GetPathMembers(false);
     object target = pathMembers.PenultimateValue;
     if (target != null && !target.IsUnsetValue())
         errorProvider.SetErrors(target, Key + pathMembers.Path.Path, errors, context ?? sender.Context);
 }
 private static void OnBindingUpdated(IDataBinding sender, BindingEventArgs args)
 {
     if (args.Exception == null)
     {
         IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;
         if (errorProvider != null)
             SetErrors(errorProvider, sender, Empty.Array<object>(), null);
     }
     else
     {
         IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;
         if (errorProvider != null)
             SetErrors(errorProvider, sender,
                 new object[] { ShowOriginalException ? args.OriginalException.Message : args.Exception.Message }, null);
     }
 }
 private static void OnBindingUpdated(IDataBinding sender, BindingEventArgs args)
 {
     IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;
     if (errorProvider != null)
         SetErrors(errorProvider, sender, Empty.Array<object>(), null);
 }
 void IBindingBehavior.Detach(IDataBinding binding)
 {
     Detach(binding);
 }
 private static void BindingExceptionHandlerImpl(IDataBinding dataBinding, BindingEventArgs bindingEventArgs)
 {
     if (bindingEventArgs.Exception != null)
         Tracer.Error(bindingEventArgs.Exception.Message);
 }
 public static void RaiseBindingException(IDataBinding binding, BindingEventArgs args)
 {
     BindingExceptionHandler?.Invoke(binding, args);
 }
 internal static Exception DuplicateBindingRegistration(IDataBinding binding)
 {
     return new InvalidOperationException($"The binding '{binding}' has already been registered, dual registration is not possible.");
 }
 internal static Exception WrapBindingException(IDataBinding binding, BindingAction action, Exception exception)
 {
     string message =
         $"A binding error has occurred, when update {(action == BindingAction.UpdateSource ? "source" : "target")}, path '{binding.TargetAccessor.Source.Path}', inner exception '{exception.Message}'";
     return new InvalidOperationException(message, exception);
 }
 public IList<IDataBinding> CreateBindingsFromString(object target, string bindingExpression, IList<object> sources = null)
 {
     Should.NotBeNull(target, "target");
     Should.NotBeNullOrWhitespace(bindingExpression, "bindingExpression");
     try
     {
         IList<IDataContext> parserResult = Parser.Parse(bindingExpression, DataContext.Empty, target, sources);
         var result = new IDataBinding[parserResult.Count];
         for (int index = 0; index < parserResult.Count; index++)
             result[index] = BuildBinding(parserResult[index]);
         return result;
     }
     catch (Exception exception)
     {
         return new[]
         {
             CreateInvalidDataBinding(new InvalidOperationException(exception.Message, exception))
         };
     }
 }
 /// <summary>
 ///     Attaches to the specified binding.
 /// </summary>
 /// <param name="binding">The binding to attach to.</param>
 bool IBindingBehavior.Attach(IDataBinding binding)
 {
     return true;
 }
 private static void ClearBinding(IDataBinding binding)
 {
     binding.Dispose();
     var dataBinding = binding as DataBinding;
     if (dataBinding == null)
         ServiceProvider.AttachedValueProvider.Clear(binding, IsRegisteredMember);
     else
         dataBinding.IsAssociated = false;
 }
 private static IDataBinding UpdateValueFactory(object o, IDataBinding dataBinding, IDataBinding arg3, object state)
 {
     ClearBinding(arg3);
     return dataBinding;
 }
 public virtual void Unregister(IDataBinding binding)
 {
     Should.NotBeNull(binding, "binding");
     object source = binding.TargetAccessor.Source.GetActualSource(false);
     string path = binding.TargetAccessor.Source.Path.Path;
     if (source != null && path != null)
         ClearBindings(source, path);
 }
 public void Detach(IDataBinding binding)
 {
 }
 public bool IsRegistered(IDataBinding binding)
 {
     return _bindingManager.IsRegistered(binding);
 }
 private static void OnBindingException(IDataBinding sender, BindingExceptionEventArgs args)
 {
     IBindingErrorProvider errorProvider = BindingServiceProvider.ErrorProvider;
     if (errorProvider != null)
         SetErrors(errorProvider, sender,
             new object[] { ShowOriginalException ? args.OriginalException.Message : args.Exception.Message }, null);
 }
 private void OnBindingException(IDataBinding sender, BindingEventArgs args)
 {
     if (args.Exception == null || args.OriginalException == null)
         return;
     UpdateErrors(new object[]
     {
         ValidatesOnExceptionsBehavior.ShowOriginalException
             ? args.OriginalException.Message
             : args.Exception.Message
     }, null);
 }