public static void SetResContext(DependencyObject obj, ResParamList value) { obj.SetValue(ResContextProperty, value); }
/// <summary> /// Our goal dynamically react to current culture and parameters changings. /// So we can't just return localized object. We create binding which /// via ProvideValue() returns BindingExpression. /// This BindingExpression provides dynamic refresh when current culture or parameters are changing. /// In spite of it's name the method returns BindingExpression, not localized value /// </summary> protected override object GetValue(IServiceProvider serviceProvider) { if (string.IsNullOrEmpty(Key)) { throw new ArgumentException("Key cannot be null"); } IProvideValueTarget targetHelper = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (!(targetHelper.TargetProperty is DependencyProperty)) { // It's setter. Return this for calling this method on real target object return(this); } DependencyObject targetObject = targetHelper.TargetObject as DependencyObject; if (targetObject != null && DesignerProperties.GetIsInDesignMode(targetObject)) { EnsureAppResourcesLoaded(); } ResParamList paramList = null; if (targetObject != null && Parameters.Count == 0) { paramList = GetResContext(targetObject); } if (paramList == null) { paramList = Parameters; } var converter = new ResConverter { KeyProvider = KeyProvider, ResExtension = this, Parameters = paramList }; Binding binding = new Binding("UICulture") { Source = CultureManager.Instance, Mode = BindingMode.OneWay }; // For simple key just watch for culture changing if (paramList.Count == 0) { binding.Converter = converter; return(binding.ProvideValue(serviceProvider)); } // For composite key or formatted string watch for culture, key parts or parameters changing var multiBinding = new MultiBinding { Mode = BindingMode.OneWay, Converter = converter }; foreach (var param in paramList) { multiBinding.Bindings.Add(param); } // Converter waits the culter as last parameter multiBinding.Bindings.Add(binding); return(multiBinding.ProvideValue(serviceProvider)); }