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); } }
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; }