2011-11-10 21 views
7

Tengo un DataGrid en una ventana de WPF. ¿Cómo puedo mostrar una columna de cadena de número de teléfono en el DataGrid en un formato de "(999) 999-9999"?Formato TextBox para el número de teléfono en WPF

La columna Número de teléfono en DataGrid usa un TextBlock en CellTemplate y un TextBox en CellEditingTemplate. El número de teléfono se almacena como una cadena sin formato, como "9995551234".

¿Es posible visualizar el teléfono como: (999) 555-1234 y editarlo como (999) 555-1234?

+1

Por qué no poner esto directamente en el modelo y añadir un ToFormattedString() u otros bienes que se enlaza a? También puedes usar un convertidor. –

Respuesta

7

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

Editar

Si su propiedad PhoneNumber es de tipo cadena, entonces no hay realmente mucho que puede hacer con StringFormat formatearlo.

En el pasado, cuando he querido hacer algo como esto, expongo una propiedad llamada FormattedPhoneNumber que devuelve el número de teléfono con formato para fines de visualización, y el cuadro de edición solo se une al viejo y simple sin formato 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

Intenté esto pero el teléfono muestra como '9995551234'. No usa StringFormat. aquí está mi columna de la cuadrícula de datos: Jerry

+0

@Jerry Oh, acabo de darme cuenta de que PhoneNumber es una cadena, así que actualicé mi respuesta. Si eso no funciona para ti, entonces quizás tengas que buscar construir o encontrar tu propio 'MaskedTextBox' para usar – Rachel

+0

Sí, ¡esto funciona genial! Agregué una clase parcial y agregué FormattedPhoneNumber como cadena pública. Entonces, en mi DataGrid, uso FormattedPhoneNumber en Celltemplate y PhoneNumber en CellEditingTemplate. Funciona genial gracias! – Jerry

0

Me gustaría extender lo que ya ha respondido Rachel. Si un número de teléfono es un número entero, StringFormat funcionaría bien. En caso de que un número de teléfono sea una cadena, me pareció que Converter es bastante útil. Esto elimina la necesidad de crear propiedades adicionales para una clase.

Aquí se muestra un ejemplo:

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