void ISupportInitialize.EndInit() { if (this.propertyName != null) { if (this.TargetName == null) { this.Property = DependencyPropertyConverter.Resolve(this.serviceProvider, this.propertyName); } else { // TargetName is specified so we need to look in the containing template for the named element IAmbientProvider ambient = (IAmbientProvider)this.serviceProvider.GetService(typeof(IAmbientProvider)); IXamlSchemaContextProvider schema = (IXamlSchemaContextProvider)this.serviceProvider.GetService(typeof(IXamlSchemaContextProvider)); // Look up the FrameworkTemplate.Template property in the xaml schema. XamlType frameworkTemplateType = schema.SchemaContext.GetXamlType(typeof(FrameworkTemplate)); XamlMember templateProperty = frameworkTemplateType.GetMember("Template"); // Get the value of the first ambient FrameworkTemplate.Template property. TemplateContent templateContent = (TemplateContent)ambient.GetFirstAmbientValue(new[] { frameworkTemplateType }, templateProperty).Value; // Look in the template for the type of TargetName. Type targetType = templateContent.GetTypeForName(this.TargetName); // Finally, find the dependency property on the type. this.Property = DependencyObject.GetPropertyFromName(targetType, this.propertyName); } } }
internal static DependencyProperty Resolve(IServiceProvider serviceProvider, string value) { IAmbientProvider ambient = (IAmbientProvider)serviceProvider.GetService(typeof(IAmbientProvider)); IXamlSchemaContextProvider schema = (IXamlSchemaContextProvider)serviceProvider.GetService(typeof(IXamlSchemaContextProvider)); // Get the XamlType which represents the <Style> element. XamlType styleType = schema.SchemaContext.GetXamlType(typeof(Style)); // The first ambient value should be the enclosing <Style>. Style style = (Style)ambient.GetFirstAmbientValue(styleType); // Get the target type for the style from this. Type targetType = style.TargetType; // And get the dependency property. return(DependencyObject.GetPropertyFromName(targetType, value)); }