//----------------------------------------------------- 
        // 
        //  Constructors
        // 
        //-----------------------------------------------------

        /// <summary> Constructor </summary>
        internal BindingExpressionBase(BindingBase binding, BindingExpressionBase parent) : base(ExpressionMode.SupportsUnboundSources) 
        {
            if (binding == null) 
                throw new ArgumentNullException("binding"); 

            _binding = binding; 
            _parentBindingExpression = parent;

            _flags = (PrivateFlags)binding.Flags;
 
            if (parent != null)
            { 
                ResolveNamesInTemplate = parent.ResolveNamesInTemplate; 

                Type type = parent.GetType(); 
                if (type == typeof(MultiBindingExpression))
                    ChangeFlag(PrivateFlags.iInMultiBindingExpression, true);
                else if (type == typeof(PriorityBindingExpression))
                    ChangeFlag(PrivateFlags.iInPriorityBindingExpression, true); 
            }
 
            // initialize tracing information 
            PresentationTraceLevel traceLevel = PresentationTraceSources.GetTraceLevel(binding);
 
            if (traceLevel > 0)
            {
                // copy TraceLevel from parent BindingBase - it can be changed later
                PresentationTraceSources.SetTraceLevel(this, traceLevel); 
            }
 
            if (TraceData.IsExtendedTraceEnabled(this, TraceDataLevel.CreateExpression)) 
            {
                if (parent == null) 
                {
                    TraceData.Trace(TraceEventType.Warning,
                                        TraceData.CreatedExpression(
                                            TraceData.Identify(this), 
                                            TraceData.Identify(binding)));
                } 
                else 
                {
                    TraceData.Trace(TraceEventType.Warning, 
                                        TraceData.CreatedExpressionInParent(
                                            TraceData.Identify(this),
                                            TraceData.Identify(binding),
                                            TraceData.Identify(parent))); 
                }
            } 
 
            if (LookupValidationRule(typeof(ExceptionValidationRule)) != null)
            { 
                ChangeFlag(PrivateFlags.iValidatesOnExceptions, true);
            }

            if (LookupValidationRule(typeof(DataErrorValidationRule)) != null) 
            {
                ChangeFlag(PrivateFlags.iValidatesOnDataErrors, true); 
            } 
        }