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); }
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); }