Пример #1
0
        /// <summary>Возвращает значение выражения.</summary>
        /// <param name="value">Привязка значения для вставки в выражение.
        /// В привязке может быть передано выражение.</param>
        /// <param name="targetType">Целевой тип. Не используется.</param>
        /// <param name="parameter">Параметр конвертера. Может быть использован для выражения.</param>
        /// <param name="culture">Культура. Не используется.</param>
        /// <returns>Возвращает результат выполнения метода <see cref="DataTable.Compute(string, string)"/> для полученного выражения.</returns>
        /// <remarks>Выражение передаётся в строке в параметре или (если нет параметра) в привязке.<br/>
        /// Если в привязке выражение, то вычисляется само выражение.<br/>
        /// Если выражение в параметре, то значение привязки вставляется в выражение методом <see cref="String.Format(string, object[])"/>.<br/>
        /// В выражение будет использован только индекс 0.</remarks>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                string expression;
                if (value == null)
                {
                    expression = (string)parameter;
                }

                else if (parameter != null)
                {
                    expression = string.Format((string)parameter, value);
                }

                else
                {
                    expression = (string)value;
                }

                object result = dataTable.Compute(expression, "");

                return(StaticMethodsOfConverters
                       .GetDefaultValueConverter(result.GetType(), targetType, false)
                       .Convert(result, targetType, null, culture));
            }
            catch (Exception)
            {
                return(DependencyProperty.UnsetValue);
            }
        }
Пример #2
0
 /// <summary>Обратная конвертация <see cref="bool"/> значения.</summary>
 /// <param name="value">Преобразуется в bool и потом складывается (XOR) с <see cref="IsNot"/>.</param>
 /// <param name="targetType">Тип свойства источника. Не используется.</param>
 /// <param name="parameter">Значение для возврата конвертером.</param>
 /// <param name="culture">Культура конвертера. Не используется.</param>
 /// <returns>Для <paramref name="value"/>^<see cref="IsNot"/>:<br/>
 /// <see langword="true"/> - возвращается <paramref name="parameter"/>;<br/>
 /// иначе - <see cref="Binding.DoNothing"/>.</returns>
 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 {
     if (StaticMethodsOfConverters.TryParse(value, out bool val) && (val ^ IsNot))
     {
         return(parameter);
     }
     return(Binding.DoNothing);
 }
Пример #3
0
        /// <summary>Возвращает результат сравнения <paramref name="value"/> с <paramref name="parameter"/>.</summary>
        /// <param name="value">Значение для сравнения.</param>
        /// <param name="targetType">Тип целевого свойства. Используется для конвертации в целевой тип.</param>
        /// <param name="parameter">Значение для сравнения.</param>
        /// <param name="culture">Культура конвертера. Не используется.</param>
        /// <returns>Возвращается сумма (XOR) резульатат сравнения <paramref name="value"/> с <paramref name="parameter"/>
        /// и <see cref="IsNot"/> преобразованная к типу целевого свойства.</returns>
        /// <remarks>Если типы значения и параметра различны, то значение преобразуется в тип параметра.<br/>
        /// Если сравниваются строки (это наиболее частый случай), надо принять во внимание,
        /// что <see cref="object.Equals(object, object)"/> выполняет регистрочувствительное сравнение.</remarks>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && parameter != null)
            {
                Type valueType     = value.GetType();
                Type parameterType = parameter.GetType();
                if (valueType != parameterType)
                {
                    value = StaticMethodsOfConverters
                            .GetDefaultValueConverter(valueType, parameterType, false)
                            .Convert(value, parameterType, null, culture);
                }
            }

            return((Equals(value, parameter) ^ IsNot).ConvertToType(targetType, culture));
        }
Пример #4
0
        /// <inheritdoc cref="IValueConverter.ConvertBack(object, Type, object, CultureInfo)"/>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return(null);
            }

            Type sourceType = SourceType ?? targetType;

            var defaultConverter = StaticMethodsOfConverters.GetDefaultValueConverter(sourceType, value.GetType(), true);

            try
            {
                return(defaultConverter.ConvertBack(value, sourceType, parameter, culture));
            }
            catch (Exception)
            {
                return(Binding.DoNothing);
            }
        }
Пример #5
0
        /// <inheritdoc cref="IValueConverter.Convert(object, Type, object, CultureInfo)"/>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return(null);
            }

            if (TargetType != null)
            {
                targetType = TargetType;
            }

            var defaultConverter = StaticMethodsOfConverters.GetDefaultValueConverter(value.GetType(), targetType, false);

            try
            {
                return(defaultConverter.Convert(value, targetType, parameter, culture));
            }
            catch (Exception)
            {
                return(DependencyProperty.UnsetValue);
            }
        }
Пример #6
0
 private string Message(object value, Type targetType, object parameter, CultureInfo culture, [CallerMemberName] string methodName = null)
 => $"{Title}.{methodName}({StaticMethodsOfConverters.ToString(value, culture)}, {targetType}), {StaticMethodsOfConverters.ToString(parameter, culture)}, {culture}";
 public override object ProvideValue(IServiceProvider serviceProvider)
 {
     return(StaticMethodsOfConverters.GetValueTypeConverter(SourceType, TargetType));
 }
Пример #8
0
 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 {
     Debug.WriteLine($"{GetType()}.{nameof(ConvertBack)}({StaticMethodsOfConverters.ToString(value, culture)}, {targetType}), {StaticMethodsOfConverters.ToString(parameter, culture)}, {culture}");
     return(value);
 }