格式化TextBox中的电话号码

Jer*_*rry 10 wpf

我在WPF窗口中有一个DataGrid.如何在DataGrid中以"(999)999-9999"格式显示电话号码字符串列?

DataGrid中的电话号码列使用CellTemplate中的TextBlock和CellEditingTemplate中的TextBox.电话号码存储为字符串,没有格式化,例如"9995551234".

是否可以将手机显示为:(999)555-1234并将其编辑为(999)555-1234?

Rac*_*hel 13

尝试使用 Text="{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}"

编辑

如果你的PhoneNumber属性是string类型,那么你可以用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


luc*_*cas 6

我想扩展雷切尔已经回应的内容。如果电话号码是整数,StringFormat 就可以正常工作。如果电话号码是字符串,我发现 Converter 非常方便。这消除了为类创建附加属性的需要。

下面是一个例子:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

xml:

<TextBox Text="{Binding SelectedParticipant.PhoneNumber, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StringToPhoneConverter}}" />
Run Code Online (Sandbox Code Playgroud)