Skip to content

Instantly share code, notes, and snippets.

@awatertrevi
Last active April 27, 2021 10:53
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save awatertrevi/68924981bdea1800f5af162e4eb2b1f5 to your computer and use it in GitHub Desktop.
Save awatertrevi/68924981bdea1800f5af162e4eb2b1f5 to your computer and use it in GitHub Desktop.
ValueConverterGroup with parameters.
public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
private string[] _parameters;
private bool _shouldReverse = false;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ExtractParameters(parameter);
if (_shouldReverse)
{
Reverse();
_shouldReverse = false;
}
return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, GetParameter(converter), culture));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ExtractParameters(parameter);
Reverse();
_shouldReverse = true;
return this.Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, GetParameter(converter), culture));
}
private void ExtractParameters(object parameter)
{
if (parameter != null)
_parameters = Regex.Split(parameter.ToString(), @"(?<!\\),");
}
private string GetParameter(IValueConverter converter)
{
if (_parameters == null)
return null;
var index = IndexOf(converter as IValueConverter);
string parameter;
try
{
parameter = _parameters[index];
}
catch (IndexOutOfRangeException ex)
{
parameter = null;
}
if (parameter != null)
parameter = Regex.Unescape(parameter);
return parameter;
}
}
@IGonza
Copy link

IGonza commented May 31, 2019

Hi,
Thanks for this code. It helped.
I’m wondering., shouldn’t parameter be reversed as well?
Thanks,
Igor

@awatertrevi
Copy link
Author

Hi @IGonza,

I think you are right. I shall try to update the snippet as soon as possible.

Thanks,

Trevi

@ADIX7
Copy link

ADIX7 commented Apr 27, 2021

ConvertBack has a bug, hasn't it? You always call Reverse(), so if ConvertBack is called twice the second time it will use the original order not the reversed. I would remove the _shouldReverse logic and simply user ((IEnumerable<IValueConverter>)this).Reverse(). It does not mutate the list.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment