Exemple #1
0
        /// <summary>
        /// Returns an object that should be set on the property where this extension is applied.
        /// </summary>
        /// <param name="serviceProvider">Object that can provide services for the markup extension.</param>
        /// <returns>The object value to set on the property where the markup extension provided
        /// value is evaluated.</returns>
        /// <exception cref="System.InvalidOperationException">serviceProvider was null, or failed to
        /// implement a required service.</exception>
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            object obj = null;
            Type   typeToResolve;

            if (_dataContextType == null)
            {
                typeToResolve = typeof(object);
            }
            else if (_dataContextType is Type)
            {
                typeToResolve = (Type)_dataContextType;
            }
            else if (_dataContextType is String)
            {
#if !WINDOWS_UWP
                // ReSharper disable SuggestUseVarKeywordEvident
                IXamlTypeResolver service = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
                // ReSharper restore SuggestUseVarKeywordEvident

                typeToResolve = BindHelper.ResolveTypeByName((string)_dataContextType);

                if ((service != null) && (typeToResolve == null))
                {
                    typeToResolve = service.Resolve((string)_dataContextType);
                }
#else
                typeToResolve = BindHelper.ResolveTypeByName((string)_dataContextType);
#endif
            }
            else
            {
                throw new ArgumentNullException("LocateDataContext - DataContextType can be 'Type' or 'String' or empty.");
            }

            // ReSharper disable SuggestUseVarKeywordEvident
            IProvideValueTarget serviceProvideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
            // ReSharper restore SuggestUseVarKeywordEvident
            if ((serviceProvideValueTarget != null) && (serviceProvideValueTarget.TargetObject != null))
            {
                // Save targets for case delayed processing
                TargetObject   = serviceProvideValueTarget.TargetObject;
                TargetProperty = serviceProvideValueTarget.TargetProperty;

                if (!(serviceProvideValueTarget.TargetObject is DependencyObject))
                {
                    throw new AggregateException("LocateDataContext - Target of the markup extension must be the DependencyObject type.");
                }
                obj = BindHelper.LocateValidDependencyPropertyByAllTrees(serviceProvideValueTarget.TargetObject as DependencyObject, FrameworkElement.DataContextProperty, MethodName, PropertyName, null, typeToResolve);
                if (obj == null)
                {
                    var frameworkElement = TargetObject as FrameworkElement;
                    if (frameworkElement != null)
                    {
                        frameworkElement.Loaded += DelayLocateDataContext;
                    }
                }
            }
            return(obj);
        }
        /// <summary>
        /// Returns an object that should be set on the property where this extension is applied.
        /// </summary>
        /// <param name="serviceProvider">Object that can provide services for the markup extension.</param>
        /// <returns>The object value to set on the property where the markup extension provided
        /// value is evaluated.</returns>
        /// <exception cref="System.InvalidOperationException">serviceProvider was null, or failed to
        /// implement a required service.</exception>
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider");
            }

            if (_serviceType == null)
            {
                // ReSharper disable NotResolvedInText
                throw new ArgumentNullException("IocBinding - ServiceType cannot be null.");
                // ReSharper restore NotResolvedInText
            }


            Type typeToResolve;

            // ReSharper disable CanBeReplacedWithTryCastAndCheckForNull
            if (_serviceType is Type)
            // ReSharper restore CanBeReplacedWithTryCastAndCheckForNull
            {
                typeToResolve = (Type)_serviceType;
            }
            // ReSharper disable CanBeReplacedWithTryCastAndCheckForNull
            else if (_serviceType is string)
            // ReSharper restore CanBeReplacedWithTryCastAndCheckForNull
            {
#if !WINDOWS_UWP
                // ReSharper disable SuggestUseVarKeywordEvident
                IXamlTypeResolver service = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
                // ReSharper restore SuggestUseVarKeywordEvident

                typeToResolve = BindHelper.ResolveTypeByName((string)_serviceType);

                if ((service != null) && (typeToResolve == null))
                {
                    typeToResolve = service.Resolve((string)_serviceType);
                }
#else
                typeToResolve = BindHelper.ResolveTypeByName((string)_serviceType);
#endif

                if (typeToResolve == null)
                {
                    throw new InvalidOperationException("IocBinding invalid  cannot resolve type - " + (string)_serviceType);
                }
            }
            else
            {
                // ReSharper disable NotResolvedInText
                throw new ArgumentNullException("IocBinding - ServiceType can be 'Type' or 'String'.");
                // ReSharper restore NotResolvedInText
            }
            if (AutoWireVmDataContext.ServiceProvider != null)
            {
                try { ResolvedResult = AutoWireVmDataContext.ServiceProvider.GetService(typeToResolve); } catch { }
                if (ResolvedResult == null)
                {
                    try { ResolvedResult = Activator.CreateInstance(typeToResolve); } catch { }
                }
            }

#if !WINDOWS_UWP
            // ReSharper disable SuggestUseVarKeywordEvident
            IProvideValueTarget valueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
            // ReSharper restore SuggestUseVarKeywordEvident

            //Attached collection support
            if ((valueTarget != null) && (valueTarget.TargetObject != null) && (valueTarget.TargetObject is FakeCollection) && (valueTarget.TargetProperty == null))
            {
                return(this);
            }

            if ((valueTarget != null) && (valueTarget.TargetObject != null) && (valueTarget.TargetProperty == BindXAML.AssignPropertiesProperty))
            {
                throw new ArgumentException("IocBinding - Coding Error Direct access to attached property XAML Parser.");
            }

            //if ((valueTarget != null) && (valueTarget.TargetObject != null) && (valueTarget.TargetProperty != null) && (valueTarget.TargetProperty as MethodInfo != null))
            //{
            //    // Support for a single attached property for WPF
            //    // XAML WinRt doesn't call ProvideValue() but WPF always does call ProvideValue()
            //    // In this case if use the single attached property we have to demonstrate
            //    return this; // That should be done like that
            //}
#endif
            if (!String.IsNullOrEmpty(PropertyName))
            {
                if (ResolvedResult != null)
                {
                    var info = ResolvedResult.GetPropertyInfo(PropertyName);
                    if (info == null)
                    {
                        throw new ArgumentException("IocBinding - cannot resolve 'TargetPropertyName' property  " + PropertyName);
                    }
                    ResolvedResult = info.GetValue(ResolvedResult, null);
                }
            }
            return(ResolvedResult);
        }