/// <summary> /// Initializes a new instance of the <see cref="BindingLocalizedValue"/> class. /// </summary> /// <param name="property">The property.</param> /// <param name="resourceKey">The resource key.</param> /// <param name="stringFormat">The string format.</param> /// <param name="bindings">The bindings.</param> /// <exception cref="ArgumentNullException"><paramref name="property"/> is null.</exception> /// <exception cref="ArgumentException">The type of the <paramref name="property"/> is neither /// <see cref="String"/> nor <see cref="Object"/>.</exception> /// <exception cref="ArgumentException"><paramref name="resourceKey"/> is null or empty /// AND <paramref name="stringFormat"/> is null or empty.</exception> /// <exception cref="ArgumentNullException"><paramref name="bindings"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="bindings"/> is empty.</exception> public BindingLocalizedValue( LocalizedDependencyProperty property, string resourceKey, string stringFormat, ICollection <BindingBase> bindings ) : base(property) { CheckPropertySupported(property); if (string.IsNullOrEmpty(resourceKey) && string.IsNullOrEmpty(stringFormat)) { throw new ArgumentException("Either a resource key of a format string must be specified."); } if (bindings == null) { throw new ArgumentNullException("bindings"); } if (bindings.Count == 0) { throw new ArgumentException("At least one binding must be specified.", "bindings"); } _resourceKey = resourceKey; _stringFormat = stringFormat; _bindings = bindings; }
/// <summary> /// When implemented in a derived class, returns an object that is set as the value of the target property for this markup extension. /// </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 extension is applied. /// </returns> public override object ProvideValue(IServiceProvider serviceProvider) { var service = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (service == null) { return(null); } if (service.TargetObject is DependencyObject) { if (service.TargetProperty is DependencyProperty) { var property = new LocalizedDependencyProperty( (DependencyObject)service.TargetObject, (DependencyProperty)service.TargetProperty ); // Check if the property supports binding localization BindingLocalizedValue.CheckPropertySupported(property); if (string.IsNullOrEmpty(ResourceKey) && string.IsNullOrEmpty(StringFormat)) { // Either a resource key of a format string must be specified return(null); } if (_bindings == null || _bindings.Count == 0) { // At least one binding must be specified return(null); } var localizedValue = new BindingLocalizedValue( property, ResourceKey, StringFormat, _bindings ); LocalizationManager.InternalAddLocalizedValue(localizedValue); if (property.IsInDesignMode) { // At design time VS designer does not set the parent of any control // before its properties are set. For this reason the correct values // of inherited attached properties cannot be obtained. // Therefore, to display the correct localized value it must be updated // later ater the parrent of the control has been set. ((DependencyObject)service.TargetObject).Dispatcher.BeginInvoke( new SendOrPostCallback(x => ((LocalizedValue)x).UpdateValue()), DispatcherPriority.ApplicationIdle, localizedValue ); } return(localizedValue.GetValue()); } else { throw new Exception("This extension can be used only with dependency properties."); } } else if (service.TargetProperty is DependencyProperty || service.TargetProperty is PropertyInfo) { // The extension is used in a template return(this); } else { return(null); } }
/// <summary> /// When implemented in a derived class, returns an object that is set as the value of the target property for this markup extension. /// </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 extension is applied. /// </returns> public override object ProvideValue(IServiceProvider serviceProvider) { var service = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (service == null) { return(null); } if (service.TargetObject is DependencyObject) { LocalizedProperty property; if (service.TargetProperty is DependencyProperty) { property = new LocalizedDependencyProperty( (DependencyObject)service.TargetObject, (DependencyProperty)service.TargetProperty ); } else if (service.TargetProperty is PropertyInfo) { property = new LocalizedNonDependencyProperty( (DependencyObject)service.TargetObject, (PropertyInfo)service.TargetProperty ); } else { return(null); } property.Converter = Converter; property.ConverterParameter = ConverterParameter; var localizedValue = CreateLocalizedValue(property); if (localizedValue == null) { return(null); } LocalizationManager.InternalAddLocalizedValue(localizedValue); if (property.IsInDesignMode) { // At design time VS designer does not set the parent of any control // before its properties are set. For this reason the correct values // of inherited attached properties cannot be obtained. // Therefore, to display the correct localized value it must be updated // later ater the parrent of the control has been set. ((DependencyObject)service.TargetObject).Dispatcher.BeginInvoke( new SendOrPostCallback(x => ((LocalizedValue)x).UpdateValue()), DispatcherPriority.ApplicationIdle, localizedValue ); } return(localizedValue.GetValue()); } /* * else if (service.TargetProperty is PropertyInfo && ((PropertyInfo)service.TargetProperty).DeclaringType == typeof(Setter)) * { * var binding = new Binding() * { * Path = new PropertyPath("ResourceKey"), * BindsDirectlyToSource = true, * Mode = BindingMode.OneWay, * Source = new { ResourceKey = "123" }, * }; * return binding; * } */ else if (service.TargetProperty is DependencyProperty || service.TargetProperty is PropertyInfo) { // The extension is used in a template return(this); } else { return(null); } }