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