Вопрос:
У меня есть 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}}» />