Example #1
0
        public virtual void AddObject(string name, ISourceValue obj, bool rewrite)
        {
            Should.NotBeNullOrWhitespace(name, nameof(name));
            Should.NotBeNull(obj, nameof(obj));
            DynamicResourceObject value;

            lock (_objects)
            {
                if (!_objects.TryGetValue(name, out value))
                {
                    value          = new DynamicResourceObject();
                    _objects[name] = value;
                }
            }
            value.SetValue(obj, name, rewrite);
        }
Example #2
0
 protected ISourceValue GetOrAddDynamicResource([NotNull] string name, bool traceWarn)
 {
     lock (_objects)
     {
         DynamicResourceObject value;
         if (!_objects.TryGetValue(name, out value))
         {
             if (traceWarn && Tracer.TraceWarning)
             {
                 Tracer.Warn(BindingExceptionManager.CannotResolveInstanceFormat2, "resource", name, GetType().Name);
             }
             value          = new DynamicResourceObject();
             _objects[name] = value;
         }
         return(value);
     }
 }
 public virtual void AddObject(string name, ISourceValue obj, bool rewrite)
 {
     Should.NotBeNullOrWhitespace(name, nameof(name));
     Should.NotBeNull(obj, nameof(obj));
     DynamicResourceObject value;
     lock (_objects)
     {
         if (!_objects.TryGetValue(name, out value))
         {
             value = new DynamicResourceObject();
             _objects[name] = value;
         }
     }
     value.SetValue(obj, name, rewrite);
 }
 protected ISourceValue GetOrAddDynamicResource([NotNull] string name, bool traceWarn)
 {
     lock (_objects)
     {
         DynamicResourceObject value;
         if (!_objects.TryGetValue(name, out value))
         {
             if (traceWarn && Tracer.TraceWarning)
                 Tracer.Warn(BindingExceptionManager.CannotResolveInstanceFormat2, "resource", name, GetType().Name);
             value = new DynamicResourceObject();
             _objects[name] = value;
         }
         return value;
     }
 }
 /// <summary>
 ///     Adds the specified object.
 /// </summary>
 public virtual void AddObject(string name, ISourceValue obj, bool rewrite)
 {
     Should.NotBeNullOrWhitespace(name, "name");
     Should.NotBeNull(obj, "obj");
     lock (_objects)
     {
         DynamicResourceObject value;
         if (!_objects.TryGetValue(name, out value))
         {
             value = new DynamicResourceObject();
             _objects[name] = value;
         }
         value.SetValue(obj, name, rewrite);
     }
     lock (_instanceObjects)
     {
         for (int i = 0; i < _instanceObjects.Count; i++)
         {
             var resourceObject = (DynamicResourceObject)_instanceObjects[i].Target;
             if (resourceObject == null)
             {
                 _instanceObjects.RemoveAt(i);
                 --i;
             }
             else
                 resourceObject.OnResourceAdded(obj, name);
         }
     }
 }
        /// <summary>
        ///     Gets an instance of <see cref="ISourceValue" /> by the specified name.
        /// </summary>
        /// <param name="name">The specified name.</param>
        /// <param name="context">The specified data context, if any.</param>
        /// <param name="throwOnError">
        ///     true to throw an exception if the type cannot be found; false to return null. Specifying
        ///     false also suppresses some other exception conditions, but not all of them.
        /// </param>
        /// <returns>An instance of <see cref="ISourceValue" />.</returns>
        public virtual ISourceValue ResolveObject(string name, IDataContext context, bool throwOnError)
        {
            Should.NotBeNullOrWhitespace(name, "name");
            if (context != null && BindingSourceResourceName.Equals(name, StringComparison.Ordinal))
            {
                object src;
                if (context.TryGetData(BindingBuilderConstants.Source, out src))
                    return new BindingResourceObject(src, true);

                object target = null;
                IDataBinding binding;
                if (context.TryGetData(BindingConstants.Binding, out binding))
                {
                    WeakReference srcWeak;
                    if (binding.Context.TryGetData(BindingConstants.Source, out srcWeak))
                        return new BindingResourceObject(srcWeak);
                    target = binding.TargetAccessor.Source.GetSource(false);
                }
                if (target == null)
                    target = context.GetData(BindingBuilderConstants.Target);
                if (target != null)
                    return BindingServiceProvider.ContextManager.GetBindingContext(target);
            }
            lock (_objects)
            {
                DynamicResourceObject value;
                if (!_objects.TryGetValue(name, out value))
                {
                    var targetResourceObject = GetTargetResourceObject(name, context);
                    if (targetResourceObject != null)
                        return targetResourceObject;
                    if (Tracer.TraceWarning)
                        Tracer.Warn(BindingExceptionManager.CannotResolveInstanceFormat2, "resource", name, GetType().Name);
                    value = new DynamicResourceObject();
                    _objects[name] = value;
                }
                return value;
            }
        }
        private DynamicResourceObject GetTargetResourceObject(string name, IDataContext context)
        {
            var target = TryGetTarget(context);
            if (target == null)
                return null;

            string key = ResourcePrefix + name;
            var sourceValue = ServiceProvider.AttachedValueProvider.GetValue<DynamicResourceObject>(target, key, false);
            if (sourceValue == null)
            {
                var value = ResolveObjectInternal(target, name, context);
                if (value == null)
                    return null;
                sourceValue = new DynamicResourceObject();
                sourceValue.SetValue(value, name, true);
                ServiceProvider.AttachedValueProvider.SetValue(target, key, sourceValue);
                lock (_instanceObjects)
                {
                    if (_instanceObjects.Count > MaxInstanceObject)
                    {
                        for (int i = 0; i < _instanceObjects.Count; i++)
                        {
                            if (_instanceObjects[i].Target == null)
                            {
                                _instanceObjects.RemoveAt(i);
                                --i;
                            }
                        }
                    }
                    _instanceObjects.Add(ServiceProvider.WeakReferenceFactory(sourceValue));
                }
            }
            return sourceValue;
        }