Конверторы это одна из мощнейших функций вашего MVVM фреймворка и с ними может быть очень весело экспериментировать.

В моем приложении у меня есть текстовые поля различных типов и необходимо найти простой путь для автоматического форматирования таких полей, как номера телефонов и кредитных карт.

Для подобной задачи использование конвертеров было довольно тривиальным. Здесь приведен пример конвертера телефонных номеров:

public class PhoneNumberValueConverter : MvxValueConverter
{
	public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		var numbers = Regex.Replace(value.ToString(), @"\D", "");

		if (numbers.Length <= 3)
			return numbers;
		if (numbers.Length <= 7)
			return string.Format("{0}-{1}", numbers.Substring(0, 3), numbers.Substring(3));

		return string.Format("({0}) {1}-{2}", numbers.Substring(0, 3), numbers.Substring(3, 3), numbers.Substring(6));
	}

	public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		return Regex.Replace(value.ToString(), @"\D", "");
	}
}

Да, я понимаю, что это только для телефонных номеров США, но это все что мне нужно сейчас. С вводом текста в поле он форматируется на лету без изменения значения в модели представления.

Вот аналогичный конвертер для номеров кредитных карт, разделяет число на четыре группы разделенных пробелом:

public class CreditCardNumberValueConverter : MvxValueConverter
{
	public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		var builder = new StringBuilder(Regex.Replace(value.ToString(), @"\D", ""));

		foreach (var i in Enumerable.Range(0, builder.Length / 4).Reverse())
			builder.Insert(4*i + 4, " ");

		return builder.ToString().Trim();
	}

	public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		return Regex.Replace(value.ToString(), @"\D", "");
	}
}

Вот, описанное в действии:

Анимированный пример

На этом все!

Оригинал

Теги: c#, mvvm, mvvmcross, перевод