Ejemplo n.º 1
0
 public static void SetResContext(DependencyObject obj, ResParamList value)
 {
     obj.SetValue(ResContextProperty, value);
 }
Ejemplo n.º 2
0
        /// <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));
        }