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