2011-11-10 61 views
7

Tôi có một DataGrid trong một cửa sổ WPF. Làm thế nào tôi có thể hiển thị một cột chuỗi số điện thoại trong DataGrid theo định dạng "(999) 999-9999"?Định dạng TextBox cho số điện thoại trong WPF

Cột Số điện thoại trong DataGrid sử dụng một TextBlock trong CellTemplate và một TextBox trong CellEditingTemplate. Số điện thoại được lưu dưới dạng chuỗi không có dạng như "9995551234".

Có thể hiển thị điện thoại dưới dạng: (999) 555-1234 và chỉnh sửa điện thoại dưới dạng (999) 555-1234 không?

+1

Tại sao không đặt này trực tiếp vào mô hình và thêm một ToFormattedString() hoặc tài sản khác mà bạn liên kết với? Bạn cũng có thể sử dụng Trình chuyển đổi. –

Trả lời

7

Thử sử dụng Text="{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}"

Sửa

Nếu tài sản PhoneNumber của bạn là kiểu string, sau đó không thực sự rất nhiều bạn có thể làm với StringFormat để định dạng nó.

Trong quá khứ khi tôi đã muốn làm một cái gì đó như thế này, tôi tiếp xúc với một tính chất gọi FormattedPhoneNumber mà trả về số điện thoại định dạng cho mục đích hiển thị, và các hộp soạn thảo chỉ liên kết với đồng bằng cũ chưa định dạng 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; 
     } 
    } 
} 
+0

Tôi đã thử điều này nhưng điện thoại hiển thị là '9995551234'. Nó không sử dụng StringFormat. đây là cột của tôi về DataGrid: Jerry

+0

@Jerry Oh Tôi vừa nhận ra PhoneNumber là một chuỗi, vì vậy hãy cập nhật câu trả lời của tôi. Nếu điều đó không làm việc cho bạn thì bạn có thể phải xem xét việc xây dựng hoặc tìm kiếm 'MaskedTextBox' của riêng bạn để sử dụng – Rachel

+0

Có, điều này hoạt động tuyệt vời! Tôi đã thêm một Partial Class và thêm FormattedPhoneNumber như một chuỗi công cộng. Vì vậy, trong DataGrid của tôi, tôi sử dụng FormattedPhoneNumber trong Celltemplate và PhoneNumber trong CellEditingTemplate. Làm việc tuyệt vời nhờ! – Jerry

0

Tôi muốn mở rộng những gì Rachel đã trả lời. Nếu một số điện thoại là một số nguyên, StringFormat sẽ hoạt động tốt. Trong trường hợp một số điện thoại là một chuỗi, tôi thấy Converter khá tiện dụng. Điều này loại bỏ sự cần thiết phải tạo thêm thuộc tính cho một lớp.

Dưới đây là một ví dụ:

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}}" /> 
Các vấn đề liên quan