Формат TextBox для номера телефона в WPF

Вопрос:У меня есть DataGrid в окне WPF. Как я могу отобразить столбец строки номера телефона в DataGrid в формате "(999) 999-9999"? В столбце Номер телефона в DataGrid используется TextBlock в CellTemplate и TextBox в CellEditingTemplate. Номер телефона сохраняется как строка без формации, например "9995551234". Можно ли отобразить телефон как: (999) 555-1234 и отредактировать его как

Вопрос:

У меня есть DataGrid в окне WPF. Как я могу отобразить столбец строки номера телефона в DataGrid в формате “(999) 999-9999”?

В столбце Номер телефона в DataGrid используется TextBlock в CellTemplate и TextBox в CellEditingTemplate. Номер телефона сохраняется как строка без формации, например “9995551234”.

Можно ли отобразить телефон как: (999) 555-1234 и отредактировать его как (999) 555-1234?

Лучший ответ:

Попробуйте использовать Text=»{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}»

Edit

Если ваше свойство PhoneNumber имеет строку типа, то нечего делать с StringFormat, чтобы отформатировать его.

В прошлом, когда я хотел сделать что-то вроде этого, я выставляю свойство с именем FormattedPhoneNumber, которое возвращает форматированный номер телефона для целей отображения, а поле редактирования просто связывается с простым старым неформатированным PhoneNumber

public string FormattedPhoneNumber { get { if (PhoneNumber == null) return string.Empty; switch (PhoneNumber.Length) { case 7: return Regex.Replace(PhoneNumber, @»(d{3})(d{4})», «$1-$2″); case 10: return Regex.Replace(PhoneNumber, @»(d{3})(d{3})(d{4})», «($1) $2-$3″); case 11: return Regex.Replace(PhoneNumber, @»(d{1})(d{3})(d{3})(d{4})», «$1-$2-$3-$4»); default: return PhoneNumber; } } } Ответ №1

после короткого поиска в Google я нашел эти две ссылки
второй находится на немецком языке

WPF – поведение текстового поля в масках
http://marlongrech.wordpress.com/2007/10/28/masked-textbox/

Маскированный текстовый блок
http://blindmeis.wordpress.com/2010/06/01/wpf-masked-textbox-behavior/

надеюсь, что это поможет

Ответ №2

Я хотел бы продлить то, что уже ответила Рейчел. Если номер телефона является целым числом, StringFormat будет работать нормально. Если номер телефона является строкой, я нашел конвертер весьма удобным. Это устраняет необходимость создания дополнительного свойства для класса.

Вот пример:

public class StringToPhoneConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) return string.Empty; //retrieve only numbers in case we are dealing with already formatted phone no string phoneNo = value.ToString().Replace(«(«, string.Empty).Replace(«)», string.Empty).Replace(» «, string.Empty).Replace(«-«, string.Empty); switch (phoneNo.Length) { case 7: return Regex.Replace(phoneNo, @»(d{3})(d{4})», «$1-$2″); case 10: return Regex.Replace(phoneNo, @»(d{3})(d{3})(d{4})», «($1) $2-$3″); case 11: return Regex.Replace(phoneNo, @»(d{1})(d{3})(d{3})(d{4})», «$1-$2-$3-$4»); default: return phoneNo; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value; } }

XAML:

<TextBox Text=»{Binding SelectedParticipant.PhoneNumber, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StringToPhoneConverter}}» />

Оцените статью
Добавить комментарий