Example #1
0
        protected static object ApplyConverter(DependencyProperty dp, BindingExression be, object value, IDataContextProvider source)
        {
            if (be.Converter != null && value != DependencyProperty.UnsetValue)
            {
                var setter = be.Converter as IDataContextProviderSetter;
                setter?.ApplyProvider(source);

                value = be.Converter.Convert(value, dp.PropertyType, be.Parameter, CultureInfo.CurrentCulture);
                if (value == null)
                {
                    return(dp.GetDefaultValue());
                }
            }
            return(value);
        }
Example #2
0
        internal virtual object GetValueInternal(DependencyProperty dp, bool returnUnsetValue = false)
        {
            var     value  = DependencyProperty.UnsetValue;
            ILogger logger = null;

            if (dp.Log)
            {
                logger = ObjectFactoryBase.Resolve <ILogger>();
            }

            if (dp.Log)
            {
                logger.Debug(string.Format("{0} {1} {2}", dp.Name, dp.PropertyType, dp.GetHashCode()));
            }

            if (value == DependencyProperty.UnsetValue)
            {
                // получаем из биндинга
                BindingExression binding;
                if (_bindings.TryGetValue(dp, out binding))
                {
                    // вот тут у нас есть выражение типа Product.Id
                    var bindingProvider = binding.BindingValueProvider ?? BindingValueProviderFactory.Current.GetBindingValueProvider(this);

                    value = bindingProvider.GetValue(dp, binding, this);
                }
                else
                {
                    if (dp.Log)
                    {
                        logger.Debug(string.Format("binding not found for {0} {1} {2}", dp.Name, dp.PropertyType, dp.GetHashCode()));
                    }
                }
            }

            // получаем из локальных значений
            if (value == DependencyProperty.UnsetValue)
            {
                ValueEntry entry;
                if (_valueTable.TryGetValue(dp, out entry))
                {
                    value = entry.Value;
                }
                else
                {
                    if (dp.Log)
                    {
                        logger.Debug(string.Format("local entry not found for {0} {1} {2}", dp.Name, dp.PropertyType, dp.GetHashCode()));
                    }
                }
            }

            // получаем по иерархии для объектов-наследников данного типа, находящихся выше по иерархии

            if (value == DependencyProperty.UnsetValue && dp.Inherit && Parent != null)
            {
                value = this.Parent.GetValueInternal(dp, returnUnsetValue: true);
            }

            if (!returnUnsetValue && value == DependencyProperty.UnsetValue)
            {
                // берем по умолчанию

                value = dp.GetDefaultValue();
            }

            return(value);
        }