我在WPF窗口中有一个DataGrid。如何以"(999)999-9999"?
的格式在DataGrid中显示电话号码字符串列?DataGrid中的电话号码列使用CellTemplate中的TextBlock和CellEditingTemplate中的TextBox。电话号码存储为字符串,没有格式化,例如" 9995551234"。
是否可以将手机显示为:(999)555-1234并将其编辑为(999)555-1234?
答案 0 :(得分:13)
尝试使用Text="{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}"
修改强>
如果您的PhoneNumber
属性是字符串类型,那么您可以使用StringFormat
对其进行格式化,这并不是很多。
过去当我想做这样的事情时,我会公开一个名为FormattedPhoneNumber
的属性,它返回格式化的电话号码以供显示,编辑框只是绑定到普通的未格式化的{{1} }}
PhoneNumber
答案 1 :(得分:3)
我想扩展Rachel已经回复的内容。如果电话号码是一个整数,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}}" />
答案 2 :(得分:2)
WPF - 蒙面文本框行为 http://marlongrech.wordpress.com/2007/10/28/masked-textbox/
Masked TextBox http://blindmeis.wordpress.com/2010/06/01/wpf-masked-textbox-behavior/
希望这会有所帮助