在 WPF 中设置电话号码的文本框格式

问题描述 投票:0回答:3

我在 WPF 窗口中有一个

DataGrid
。如何以
"(999)999-9999"
的格式在 DataGrid 中显示电话号码字符串列?

DataGrid
中的电话号码列使用
TextBlock
中的
CellTemplate
TextBox
中的
CellEditingTemplate
。电话号码存储为不带格式的字符串,例如 “9995551234”

是否可以将电话显示为:(999)555-1234并编辑为

(999)555-1234

wpf
3个回答
13
投票

尝试使用

Text="{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}"

编辑

如果您的

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;
        }
    }
}

9
投票

我想扩展雷切尔已经做出的回应。如果电话号码是整数,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;
    }
}

xaml:

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

2
投票

经过短暂的谷歌搜索后,我发现了这两个链接 第二个是德语

WPF – 屏蔽文本框行为 http://marlongrech.wordpress.com/2007/10/28/masked-textbox/

屏蔽文本框 http://blindmeis.wordpress.com/2010/06/01/wpf-masked-textbox-behavior/

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.