2011-11-10 29 views
7

Mam DataGrid w oknie WPF. Jak wyświetlić kolumnę numeru telefonu w DataGrid w formacie "(999) 999-9999"?Formatowanie TextBox dla numeru telefonu w WPF

Kolumna Numer telefonu w DataGrid używa TextBlock w CellTemplate i TextBox w CellEditingTemplate. Numer telefonu jest zapisany jako ciąg bez formowania, np. "9995551234".

Czy można wyświetlić telefon jako: (999) 555-1234 i edytować jako (999) 555-1234?

+1

Dlaczego nie umieścić to bezpośrednio do modelu i dodać ToFormattedString() lub innej własności którym wiązania? Możesz także użyć konwertera. –

Odpowiedz

7

Spróbuj użyć Text="{Binding PhoneNumber, StringFormat={}{0:(###)###-####}}"

Edit

Jeśli nieruchomość PhoneNumber jest typu ciąg znaków, a następnie tam naprawdę nie jest dużo można zrobić z StringFormat aby go sformatować.

W przeszłości, kiedy ja chciałem zrobić coś takiego, mam narazić właściwość o nazwie FormattedPhoneNumber która zwraca sformatowany numer telefonu do celów wystawowych, a pole edycji właśnie wiąże się zwykły stary niesformatowany 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

Próbowałem tego, ale telefon wyświetla się jako "9995551234". Nie używa StringFormat. tutaj jest moja kolumna datagrid: Jerry

+0

@Jerry Oh Właśnie zdałem sobie sprawę, że PhoneNumber jest ciągiem, więc zaktualizowałem moją odpowiedź. Jeśli to nie działa dla Ciebie, być może będziesz musiał zagłębić się w budowanie lub znajdowanie własnego 'MaskedTextBox' do użycia – Rachel

+0

Tak, działa to świetnie! Dodałem klasę Częściową i dodałem FormattedPhoneNumber jako publiczny ciąg. Tak więc w mojej DataGrid używam FormattedPhoneNumber w Celltemplate i PhoneNumber w CellEditingTemplate. Działa świetnie dzięki! – Jerry

0

Chciałbym przedłużyć to, co już zareagowała Rachel. Jeśli numer telefonu jest liczbą całkowitą, StringFormat będzie działał dobrze. Jeśli numer telefonu jest ciągiem, przekonałem się, że Konwerter jest całkiem przydatny. Dzięki temu nie trzeba tworzyć dodatkowej właściwości dla klasy.

Oto przykład:

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}}" />