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