/// <summary>
        /// Sets the binding between target and source.
        /// </summary>
        public static IBindingExpression AddBinding(this IPropertyInjection target, string propertyName, object source, Binding binding)
        {
            var scope = target.GetBindingScopeOrDefault();

            var expression = new WeakBindingExpression(target, propertyName, source, binding);
            scope.Add(expression);
            return expression;
        }
        /// <summary>
        /// Replaces the source object that is bound to target.
        /// </summary>
        public static void ReplaceBindingSource(this IBindingScope scope, object source, string targetPropertyName)
        {
            var allBindingExpressions = scope.GetBindingExpressions();
            var bindingExpressions = allBindingExpressions.Where(x => string.IsNullOrEmpty(targetPropertyName) || x.TargetProperty.Equals(targetPropertyName)).ToList();
            
            var newExpressions = new List<IBindingExpression>();
            
            foreach (var expression in bindingExpressions)
            {
                var newExpression = new WeakBindingExpression(expression.Target, expression.TargetProperty, source, expression.Binding);
                newExpression.Bind();
                newExpressions.Add(newExpression);
            }

            // don't remove all bindings, just the ones we replaced
            foreach (var expression in bindingExpressions)
            {
                scope.Remove(expression);
            }

            foreach (var expression in newExpressions)
            {
                scope.Add(expression);
            }
        }
 /// <summary>
 /// Sets the binding between target and source.
 /// </summary>
 public static IBindingExpression AddBinding(this IBindingScope scope, object target, string propertyName, object source, Binding binding)
 {
     var expression = new WeakBindingExpression(target, propertyName, source, binding);
     scope.Add(expression);
     return expression;
 }
 protected virtual IBindingExpression GetExpression()
 {
     var binding = new WeakBindingExpression(this.Target, "PropertyA", this.Source, this.Binding);
     binding.Bind();
     return binding;
 }