object[] IMultiValueConverter.ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            if (value == DependencyProperty.UnsetValue)
            {
                return(Enumerable.Repeat(DependencyProperty.UnsetValue, targetTypes.Length).ToArray());
            }
            var castedValue = ChainConverterHelper.CastValue <TTo>(value, this);

            return(ConvertBack(castedValue, targetTypes, parameter, culture).Cast <object>().ToArray());
        }
        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureArgumentType cultureArgument)
        {
            if (value == DependencyProperty.UnsetValue)
            {
                return(DependencyProperty.UnsetValue);
            }
            var    castedValue    = ChainConverterHelper.CastValue <TTo>(value, this);
            object convertedValue = ConvertBack(castedValue, targetType, parameter, cultureArgument);

            if (Converter != null)
            {
                convertedValue = Converter.ConvertBack(convertedValue, targetType, parameter, cultureArgument);
            }
            return(convertedValue);
        }
        object IMultiValueConverter.Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Any(x => Equals(x, DependencyProperty.UnsetValue)))
            {
                return(DependencyProperty.UnsetValue);
            }
            var    castedValues   = values.Select(x => ChainConverterHelper.CastValue <TFrom>(x, this)).ToArray();
            object convertedValue = Convert(castedValues, targetType, parameter, culture);

            if (Converter != null)
            {
                var innerCultureArgument = GetCultureArgumentForInnerConverter(culture);
                convertedValue = Converter.Convert(convertedValue, targetType, parameter, innerCultureArgument);
            }
            return(convertedValue);
        }
        object IValueConverter.Convert(object value, Type targetType, object parameter, CultureArgumentType cultureArgument)
        {
            if (value == DependencyProperty.UnsetValue)
            {
                return(DependencyProperty.UnsetValue);
            }
            var castedValue = ChainConverterHelper.CastValue <TFrom>(value, this);

            if (CheckToStopChainConverting(castedValue, targetType, parameter, cultureArgument))
            {
                return(GetStoppedValue(castedValue, targetType, parameter, cultureArgument));
            }
            var valueToConvert = GetValueToConvert(castedValue, targetType, parameter, cultureArgument);

            if (Converter != null)
            {
                return(Converter.Convert(valueToConvert, targetType, parameter, cultureArgument));
            }
            return(valueToConvert);
        }