예제 #1
0
        public Expression <BindingDelegate> CompileToDelegate(
            CastedExpressionBindingProperty expression, DataContextStack dataContext)
        {
            var expr = BindingCompiler.ReplaceParameters(expression.Expression, dataContext);

            expr = new ExpressionNullPropagationVisitor(e => true).Visit(expr);
            expr = ExpressionUtils.ConvertToObject(expr);
            return(Expression.Lambda <BindingDelegate>(expr, BindingCompiler.ViewModelsParameter, BindingCompiler.CurrentControlParameter));
        }
예제 #2
0
        public Expression <BindingUpdateDelegate> CompileToUpdateDelegate(ParsedExpressionBindingProperty binding, DataContextStack dataContext)
        {
            var valueParameter = Expression.Parameter(typeof(object), "value");
            var expr           = BindingCompiler.ReplaceParameters(binding.Expression, dataContext);

            // don't throw exception, it is annoying to debug.
            if (expr.NodeType != ExpressionType.Parameter &&
                (expr.NodeType != ExpressionType.MemberAccess || (!expr.CastTo <MemberExpression>().Member.As <PropertyInfo>()?.CanWrite ?? false)) &&
                expr.NodeType != ExpressionType.Index)
            {
                return(null);
            }

            var assignment = Expression.Assign(expr, Expression.Convert(valueParameter, expr.Type));

            return(Expression.Lambda <BindingUpdateDelegate>(assignment, BindingCompiler.ViewModelsParameter, BindingCompiler.CurrentControlParameter, valueParameter));
        }
예제 #3
0
        public Expression <BindingUpdateDelegate> CompileToUpdateDelegate(ParsedExpressionBindingProperty binding, DataContextStack dataContext)
        {
            var valueParameter = Expression.Parameter(typeof(object), "value");
            var body           = BindingCompiler.ReplaceParameters(binding.Expression, dataContext);

            body = ExpressionHelper.UpdateMember(body, valueParameter);
            if (body == null)
            {
                return(null);
            }

            return(Expression.Lambda <BindingUpdateDelegate>(
                       body,
                       BindingCompiler.ViewModelsParameter,
                       BindingCompiler.CurrentControlParameter,
                       valueParameter));
        }