static BindingPath() { Cache = new Dictionary<string, IBindingPath>(); None = Create("##none##", false); Empty = Create(string.Empty, false); DataContext = Create(AttachedMemberConstants.DataContext); }
public BindingPathMembersMock(object source, IBindingPath path) { Path = path; AllMembersAvailable = source != null; Source = source; PenultimateValue = source; _members = Empty.Array<IBindingMemberInfo>(); LastMember = BindingMemberInfo.Empty; }
private IExpressionNode GetResourceMember(IExpressionNode node, string memberName, IList <IExpressionNode> nodes) { IExpressionNode staticValue; if (_staticNodes.TryGetValue(node, out staticValue)) { return(staticValue); } IBindingPath path = BindingPath.Create(memberName); string firstMember = path.Parts[0]; Type type = BindingServiceProvider.ResourceResolver.ResolveType(firstMember, DataContext.Empty, false); var dynMember = (ResourceExpressionNode)nodes[0]; if (dynMember.Dynamic && type == null) { memberName = BindingExtensions.MergePath(path.Parts.Skip(1).ToArray()); return(GetOrAddBindingMember("$" + path.Path, (s, i) => new BindingMemberExpressionNode(firstMember, memberName, s, i))); } bool dynamicMember = false; IExpressionNode firstMemberNode = nodes[1]; if (!_staticNodes.TryGetValue(firstMemberNode, out staticValue)) { if (type == null) { IBindingResourceObject resourceObject = BindingServiceProvider .ResourceResolver .ResolveObject(firstMember, DataContext.Empty, true); var dynamicObject = resourceObject.Value as IDynamicObject; if (dynamicObject == null || path.Parts.Count <= 1) { staticValue = new ConstantExpressionNode(resourceObject.Value, resourceObject.Type); } else { staticValue = new ConstantExpressionNode(dynamicObject.GetMember(path.Parts[1], Empty.Array <object>())); dynamicMember = true; } } else { staticValue = new ConstantExpressionNode(type, typeof(Type)); } _staticNodes[firstMemberNode] = staticValue; if (dynamicMember) { _staticNodes[nodes[2]] = staticValue; } } if (firstMemberNode == node || (dynamicMember && node == nodes[2])) { return(staticValue); } return(node); }
public void BindingPathShouldParseMultiPropertyWithIndexer() { var strings = new[] { "[test]", "Test1", "Test2[test]", "Test3" }; var items = new[] { "[test]", "Test1", "Test2", "[test]", "Test3" }; string path = string.Join(".", strings); IBindingPath bindingPath = GetBindingPath(path); bindingPath.Parts.SequenceEqual(items).ShouldBeTrue(); bindingPath.Path.ShouldEqual(path); }
public SinglePathObserver([NotNull] object source, [NotNull] IBindingPath path, bool ignoreAttachedMembers, bool hasStablePath, bool observable, bool optional) : base(source, path) { Should.BeSupported(path.IsSingle, "The SinglePathObserver supports only single path members."); _ignoreAttachedMembers = ignoreAttachedMembers; _ref = ToolkitServiceProvider.WeakReferenceFactory(this); _hasStablePath = hasStablePath; _observable = observable; _optional = optional; }
/// <summary> /// Attempts to track the value change using the binding path. /// </summary> public virtual IObserver Observe(object target, IBindingPath path, bool ignoreAttachedMembers) { Should.NotBeNull(target, "target"); Should.NotBeNull(path, "path"); if (path.IsSingle) return new SinglePathObserver(target, path, ignoreAttachedMembers); if (path.IsEmpty) return new EmptyPathObserver(target, path); return new MultiPathObserver(target, path, ignoreAttachedMembers); }
public MultiPathObserver([NotNull] object source, [NotNull] IBindingPath path, bool ignoreAttachedMembers, bool hasStablePath, bool observable, bool optional) : base(source, path) { Should.BeSupported(!path.IsEmpty, "The MultiPathObserver doesn't support the empty path members."); _listeners = new List <IDisposable>(path.Parts.Count - 1); _ignoreAttachedMembers = ignoreAttachedMembers; _lastMemberListener = new LastMemberListener(ServiceProvider.WeakReferenceFactory(this)); _hasStablePath = hasStablePath; _observable = observable; _optional = optional; }
/// <summary> /// Initializes a new instance of the <see cref="MultiPathObserver" /> class. /// </summary> public MultiPathObserver([NotNull] object source, [NotNull] IBindingPath path, bool ignoreAttachedMembers) : base(source, path) { Should.BeSupported(!path.IsEmpty, "The MultiPathObserver doesn't support the empty path members."); _listeners = new List <IDisposable>(path.Parts.Count - 1); _ignoreAttachedMembers = ignoreAttachedMembers; _members = UnsetBindingPathMembers.Instance; _selfReference = ServiceProvider.WeakReferenceFactory(this, true); _lastMemberListener = new LastMemberListener(_selfReference); Update(); }
public BindingPathMembersMock(object source, IBindingPath path, object penultimateValue, IList<IBindingMemberInfo> members, bool allMembersAvailable) { Path = path; Source = source; PenultimateValue = penultimateValue; AllMembersAvailable = allMembersAvailable && penultimateValue != null; _members = members ?? Empty.Array<IBindingMemberInfo>(); if (allMembersAvailable && _members.Count != 0) LastMember = _members[_members.Count - 1]; else LastMember = BindingMemberInfo.Unset; }
/// <summary> /// Attempts to track the value change using the binding path. /// </summary> public virtual IObserver Observe(object target, IBindingPath path, bool ignoreAttachedMembers) { Should.NotBeNull(target, "target"); Should.NotBeNull(path, "path"); if (path.IsSingle) { return(new SinglePathObserver(target, path, ignoreAttachedMembers)); } if (path.IsEmpty) { return(new EmptyPathObserver(target, path)); } return(new MultiPathObserver(target, path, ignoreAttachedMembers)); }
protected ObserverBase([NotNull] object source, [NotNull] IBindingPath path) { Should.NotBeNull(source, "source"); Should.NotBeNull(path, "path"); _path = path; if (source is ISourceValue) { _source = source; } else { _source = ServiceProvider.WeakReferenceFactory(source); } }
public BindingPathMembersMock(object source, IBindingPath path, IBindingMemberInfo member) { Source = source; PenultimateValue = source; Path = path; if (member == null || source == null) { AllMembersAvailable = false; LastMember = BindingMemberInfo.Unset; _members = Empty.Array<IBindingMemberInfo>(); } else { AllMembersAvailable = true; LastMember = member; } }
public virtual void BindingShouldBeRegisteredInBindingManager() { var target = new object(); IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); DataBinding binding = CreateDataBinding( new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => target, Path = path } }, new BindingSourceAccessorMock(), bindingManager); bindingManager.Register(target, path.Path, binding); bindingManager.GetBindings(target).Single().ShouldEqual(binding); bindingManager.GetBindings(target, path.Path).Single().ShouldEqual(binding); }
/// <summary> /// Initializes a new instance of the <see cref="BindingPathMembersMock" /> class. /// </summary> public BindingPathMembersMock(object source, IBindingPath path, IBindingMemberInfo member) { Source = source; PenultimateValue = source; Path = path; if (member == null || source == null) { AllMembersAvailable = false; LastMember = BindingMemberInfo.Unset; _members = Empty.Array <IBindingMemberInfo>(); } else { AllMembersAvailable = true; LastMember = member; } }
/// <summary> /// Initializes a new instance of the <see cref="BindingPathMembersMock" /> class. /// </summary> public BindingPathMembersMock(object source, IBindingPath path, object penultimateValue, IList <IBindingMemberInfo> members, bool allMembersAvailable) { Path = path; Source = source; PenultimateValue = penultimateValue; AllMembersAvailable = allMembersAvailable && penultimateValue != null; _members = members ?? Empty.Array <IBindingMemberInfo>(); if (allMembersAvailable && _members.Count != 0) { LastMember = _members[_members.Count - 1]; } else { LastMember = BindingMemberInfo.Unset; } }
public virtual void BindingShouldCorrectInitializeProperties() { IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); binding.TargetAccessor.ShouldEqual(target); binding.SourceAccessor.ShouldEqual(source); binding.Behaviors.ShouldBeEmpty(); }
public static object GetValueFromPath(object src, string strPath, int firstMemberIndex = 0) { IBindingPath path = BindingServiceProvider.BindingPathFactory(strPath); for (int index = firstMemberIndex; index < path.Parts.Count; index++) { string item = path.Parts[index]; if (src.IsNullOrUnsetValue()) { return(null); } IBindingMemberInfo member = BindingServiceProvider .MemberProvider .GetBindingMember(src.GetType(), item, false, true); src = member.GetValue(src, null); } return(src); }
public virtual void BindingShouldAddSelfToDataContext() { IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); var dataContext = binding.Context; dataContext.Count.ShouldEqual(1); dataContext.GetData(BindingConstants.Binding).ShouldEqual(binding); }
/// <summary> /// Initializes a new instance of the <see cref="ObserverBase" /> class. /// </summary> protected ObserverBase([NotNull] object source, [NotNull] IBindingPath path) { Should.NotBeNull(source, "source"); Should.NotBeNull(path, "path"); _path = path; var sourceValue = source as ISourceValue; if (sourceValue == null) { _sourceValue = ServiceProvider.WeakReferenceFactory(source, true); } else { _isSourceValue = true; _sourceValue = sourceValue; sourceValue.ValueChanged += OnMemberChangedImpl; } }
public virtual IObserver Observe(object target, IBindingPath path, bool ignoreAttachedMembers, IDataContext context) { Should.NotBeNull(target, nameof(target)); Should.NotBeNull(path, nameof(path)); if (path.IsEmpty) return new EmptyPathObserver(target, path); bool hasStablePath; bool observable; bool optional; if (context == null || !context.TryGetData(BindingBuilderConstants.HasStablePath, out hasStablePath)) hasStablePath = BindingServiceProvider.HasStablePathDefault; if (context == null || !context.TryGetData(BindingBuilderConstants.Observable, out observable)) observable = BindingServiceProvider.ObservablePathDefault; if (context == null || !context.TryGetData(BindingBuilderConstants.Optional, out optional)) optional = BindingServiceProvider.OptionalBindingDefault; if (path.IsSingle) return new SinglePathObserver(target, path, ignoreAttachedMembers, hasStablePath, observable, optional); return new MultiPathObserver(target, path, ignoreAttachedMembers, hasStablePath, observable, optional); }
public virtual IObserver Observe(object target, IBindingPath path, bool ignoreAttachedMembers, IDataContext context) { Should.NotBeNull(target, nameof(target)); Should.NotBeNull(path, nameof(path)); string tag; if (context != null && context.TryGetData(BindingBuilderConstants.DebugTag, out tag)) { path = new DebuggableBindingPathWrapper(path, tag); } if (path.IsEmpty) { return(new EmptyPathObserver(target, path)); } bool hasStablePath; bool observable; bool optional; if (context == null || !context.TryGetData(BindingBuilderConstants.HasStablePath, out hasStablePath)) { hasStablePath = BindingServiceProvider.HasStablePathDefault; } if (context == null || !context.TryGetData(BindingBuilderConstants.Observable, out observable)) { observable = BindingServiceProvider.ObservablePathDefault; } if (context == null || !context.TryGetData(BindingBuilderConstants.Optional, out optional)) { optional = BindingServiceProvider.OptionalBindingDefault; } if (path.IsSingle) { return(new SinglePathObserver(target, path, ignoreAttachedMembers, hasStablePath, observable, optional)); } return(new MultiPathObserver(target, path, ignoreAttachedMembers, hasStablePath, observable, optional)); }
public virtual void BindingShouldNotAddSameBehavior() { IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); var first = new BindingBehaviorMock { Id = Guid.Empty, Attach = binding1 => true }; binding.Behaviors.Add(first); ShouldThrow(() => binding.Behaviors.Add(first)); }
public virtual void BindingShouldThrowExceptionDuplicateIdBehavior() { IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new BindingSourceMock { GetSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); var first = new BindingBehaviorMock { Id = Guid.Empty, Attach = binding1 => true }; var second = new BindingBehaviorMock { Id = Guid.Empty, Attach = binding1 => true }; binding.Behaviors.Add(first); ShouldThrow(() => binding.Behaviors.Add(second)); }
public virtual void BindingShouldNotAddBehaviorIfAttachReturnsFalse() { IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); var first = new BindingBehaviorMock { Id = Guid.Empty, Attach = binding1 => false }; binding.Behaviors.Add(first); binding.Behaviors.Count.ShouldEqual(0); binding.Behaviors.Contains(first).ShouldBeFalse(); }
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))); }
public virtual void BindingShouldRaiseEventWhenUpdateTargetFalse() { bool isInvoked = false; IBindingPath path = BindingPath.Create("test"); var bindingManager = new BindingManager(); var target = new BindingSourceAccessorMock { Source = new ObserverMock { GetActualSource = b => new object(), Path = path } }; var source = new BindingSourceAccessorMock(); DataBinding binding = CreateDataBinding(target, source, bindingManager); target.SetValue = (func, context, arg3) => false; binding.BindingUpdated += (sender, args) => { args.Action.ShouldEqual(BindingAction.UpdateTarget); args.Result.ShouldBeFalse(); isInvoked = true; }; binding.UpdateTarget(); isInvoked.ShouldBeTrue(); }
private static IObserver BindSource(IDataContext context, IBindingPath path) { object src = context.GetData(BindingBuilderConstants.Source) ?? BindingServiceProvider.ContextManager.GetBindingContext( context.GetData(BindingBuilderConstants.Target, true), context.GetData(BindingBuilderConstants.TargetPath, true).Path); return BindingServiceProvider.ObserverProvider.Observe(src, path, false, context); }
protected virtual IDataBinding CreateBinding([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { IBindingSourceAccessor sourceAccessor; var formatExpression = context.GetData(BindingBuilderConstants.MultiExpression); var sourceDelegates = context.GetData(BindingBuilderConstants.Sources, true); if (sourceDelegates.Count > 1 || formatExpression != null) { formatExpression = formatExpression ?? FormatMembersExpressionDelegate; var sources = new IObserver[sourceDelegates.Count]; for (int index = 0; index < sourceDelegates.Count; index++) sources[index] = sourceDelegates[index].Invoke(context); sourceAccessor = new MultiBindingSourceAccessor(sources, formatExpression, context); } else sourceAccessor = new BindingSourceAccessor(sourceDelegates[0].Invoke(context), context, false); var binding = new DataBinding(new BindingSourceAccessor(GetBindingTarget(context, out target, out targetPath), context, true), sourceAccessor); object source; if (context.TryGetData(BindingBuilderConstants.Source, out source)) binding.Context.AddOrUpdate(BindingConstants.Source, ToolkitExtensions.GetWeakReference(source)); AddBehaviors(binding, context); return binding; }
protected virtual IObserver GetBindingTarget([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { target = context.GetData(BindingBuilderConstants.Target, true); targetPath = context.GetData(BindingBuilderConstants.TargetPath, true); var src = context.GetData(BindingBuilderConstants.TargetSource); return BindingServiceProvider.ObserverProvider.Observe(src ?? target, targetPath, false); }
static BindingPath() { None = new BindingPath("##none##"); Empty = new BindingPath(string.Empty); DataContext = new BindingPath(AttachedMemberConstants.DataContext); }
public EmptyPathObserver([NotNull] object source, [NotNull] IBindingPath path) : base(source, path) { Should.BeSupported(path.IsEmpty, "The EmptyPathObserver supports only empty path members."); _members = new EmptyBindingPathMembers(ServiceProvider.WeakReferenceFactory(this)); }
protected virtual IDataBinding CreateBinding([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { IBindingSourceAccessor sourceAccessor; var formatExpression = context.GetData(BindingBuilderConstants.MultiExpression); var sourceDelegates = context.GetData(BindingBuilderConstants.Sources, true); if (sourceDelegates.Count > 1 || formatExpression != null) { formatExpression = formatExpression ?? FormatMembersExpressionDelegate; var sources = new IBindingSource[sourceDelegates.Count]; for (int index = 0; index < sourceDelegates.Count; index++) { sources[index] = Decorate(sourceDelegates[index].Invoke(context), false, context); } sourceAccessor = new MultiBindingSourceAccessor(sources, formatExpression, context); } else { sourceAccessor = new BindingSourceAccessor(Decorate(sourceDelegates[0].Invoke(context), false, context), context, false); } var binding = new DataBinding(new BindingSourceAccessor(GetBindingTarget(context, out target, out targetPath), context, true), sourceAccessor); AddBehaviors(binding, context); return(binding); }
/// <summary> /// Initializes a new instance of the <see cref="EmptyPathObserver" /> class. /// </summary> public EmptyPathObserver([NotNull] object source, [NotNull] IBindingPath path) : base(source, path) { Should.BeSupported(path.IsEmpty, "The EmptyPathObserver supports only empty path members."); _members = new EmptyBindingPathMembers(this); }
protected virtual IObserver GetBindingTarget([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { target = context.GetData(BindingBuilderConstants.Target, true); targetPath = context.GetData(BindingBuilderConstants.TargetPath, true); var src = context.GetData(BindingBuilderConstants.TargetSource); return(BindingServiceProvider.ObserverProvider.Observe(src ?? target, targetPath, false, context)); }
protected virtual IDataBinding CreateBinding([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { IBindingSourceAccessor sourceAccessor; var formatExpression = context.GetData(BindingBuilderConstants.MultiExpression); var sourceDelegates = context.GetData(BindingBuilderConstants.Sources, true); if (sourceDelegates.Count > 1 || formatExpression != null) { formatExpression = formatExpression ?? FormatMembersExpressionDelegate; var sources = new IObserver[sourceDelegates.Count]; for (int index = 0; index < sourceDelegates.Count; index++) { sources[index] = sourceDelegates[index].Invoke(context); } sourceAccessor = new MultiBindingSourceAccessor(sources, formatExpression, context); } else { sourceAccessor = new BindingSourceAccessor(sourceDelegates[0].Invoke(context), context, false); } var binding = new DataBinding(new BindingSourceAccessor(GetBindingTarget(context, out target, out targetPath), context, true), sourceAccessor); object source; if (context.TryGetData(BindingBuilderConstants.Source, out source)) { binding.Context.AddOrUpdate(BindingConstants.Source, ToolkitExtensions.GetWeakReference(source)); } AddBehaviors(binding, context); return(binding); }
/// <summary> /// Attempts to track the value change using the binding path. /// </summary> IObserver IObserverProvider.Observe(object target, IBindingPath path, bool ignoreAttachedMembers) { return(Observe(target, path, ignoreAttachedMembers)); }
public MultiBindingPathMembers(WeakReference observerReference, object penultimateValue, IBindingPath path, IList<IBindingMemberInfo> members) { _observerRef = observerReference; _penultimateValueRef = ToolkitExtensions.GetWeakReference(penultimateValue); _path = path; _members = members; _lastMember = _members[_members.Count - 1]; }
public SingleBindingPathMembers(WeakReference source, IBindingPath path, IBindingMemberInfo lastMember) { _reference = source; _lastMember = lastMember; _path = path; }
IObserver IObserverProvider.Observe(object target, IBindingPath path, bool ignoreAttachedMembers, IDataContext context) { if (ObserveWithContext == null) return Observe(target, path, ignoreAttachedMembers); return ObserveWithContext(target, path, ignoreAttachedMembers, context); }
protected virtual IBindingSource GetBindingTarget([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { target = context.GetData(BindingBuilderConstants.Target, true); targetPath = context.GetData(BindingBuilderConstants.TargetPath, true); IBindingSource bindingSource = new BindingTarget(BindingServiceProvider.ObserverProvider.Observe(target, targetPath, false)) { CommandParameterDelegate = context.GetData(BindingBuilderConstants.CommandParameter) }; if (_decorators.Count != 0) { return(Decorate(bindingSource, true, context)); } return(bindingSource); }
public SingleBindingPathMembers(WeakReference source, IBindingPath path, IBindingMemberInfo lastMember) { Reference = source; _lastMember = lastMember; _path = path; }
public DebuggableBindingPathWrapper(IBindingPath path, string tag) { _path = path; DebugTag = tag; }
/// <summary> /// Attempts to track the value change using the binding path. /// </summary> IObserver IObserverProvider.Observe(object target, IBindingPath path, bool ignoreAttachedMembers) { return Observe(target, path, ignoreAttachedMembers); }
protected virtual IBindingSource GetBindingTarget([NotNull] IDataContext context, out object target, out IBindingPath targetPath) { target = context.GetData(BindingBuilderConstants.Target, true); targetPath = context.GetData(BindingBuilderConstants.TargetPath, true); var src = context.GetData(BindingBuilderConstants.TargetSource); IBindingSource bindingSource = new BindingTarget(BindingServiceProvider.ObserverProvider.Observe(src ?? target, targetPath, false)) { CommandParameterDelegate = context.GetData(BindingBuilderConstants.CommandParameter) }; if (_decorators.Count != 0) return Decorate(bindingSource, true, context); return bindingSource; }