Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF中设置电话号码的格式文本框_Wpf - Fatal编程技术网

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

在WPF中设置电话号码的格式文本框,wpf,Wpf,我在WPF窗口中有一个DataGrid。如何在数据网格中以“(999)999-9999”格式显示电话号码字符串列 数据网格中的电话号码列使用CellTemplate中的TextBlock和CellEditingTemplate中的TextBox。电话号码以字符串形式存储,无格式设置,如“9995551234” 是否可以将手机显示为:(999)555-1234,并将其编辑为(999)555-1234?在短时间的谷歌搜索后,我找到了这两个链接 第二个是德语 WPF–屏蔽文本框行为 屏蔽文本框 希

我在WPF窗口中有一个DataGrid。如何在数据网格中以“(999)999-9999”格式显示电话号码字符串列

数据网格中的电话号码列使用CellTemplate中的TextBlock和CellEditingTemplate中的TextBox。电话号码以字符串形式存储,无格式设置,如“9995551234”


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

在短时间的谷歌搜索后,我找到了这两个链接 第二个是德语

WPF–屏蔽文本框行为

屏蔽文本框

希望这有帮助

试着使用
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;
        }
    }
}

我想扩展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:



为什么不直接将其放入模型中,并添加ToFormattedString()或其他绑定到的属性?你也可以使用转换器。我试过了,但手机显示为“9995551234”。它不使用StringFormat。这是我的数据网格专栏:@Jerry Oh我刚刚意识到电话号码是一个字符串,所以更新了我的答案。如果这对您不起作用,那么您可能需要查看建筑或找到自己的
MaskedTextBox
来使用是的,这非常有效!我添加了一个分部类,并将FormattedPhoneNumber添加为公共字符串。因此,在我的DataGrid中,我在Celltemplate中使用FormattedPhoneNumber,在CellEditingTemplate中使用PhoneNumber。非常好,谢谢!
<TextBox Text="{Binding SelectedParticipant.PhoneNumber, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StringToPhoneConverter}}" />