2010-11-03 23 views
12

Me gustaría validar la entrada del usuario para garantizar que sean enteros. ¿Cómo puedo hacerlo? Pensé en usar IDataErrorInfo que parece ser la forma "correcta" de hacer la validación en WPF. Así que traté de implementarlo, en mi ViewModel.Permitir solo la entrada numérica en el cuadro de texto WPF

Pero la cosa es que mi cuadro de texto está vinculado a un campo entero, y no hay ninguna necesidad de validar si un int es un int. Noté que WPF agrega automáticamente un borde rojo alrededor del cuadro de texto para notificar al usuario del error. La propiedad subyacente no cambia a un valor no válido. Pero me gustaría notificar al usuario de esto. ¿Cómo puedo hacerlo?

Respuesta

11

El borde rojo que ha visto es en realidad una ValidationTemplate, que puede ampliar y agregar una información para el usuario. Vea este ejemplo:

<UserControl.Resources> 
     <ControlTemplate x:Key="validationTemplate"> 
      <Grid> 
       <Label Foreground="Red" HorizontalAlignment="Right" VerticalAlignment="Center">Please insert a integer</Label> 
       <Border BorderThickness="1" BorderBrush="Red"> 
        <AdornedElementPlaceholder /> 
       </Border> 
      </Grid> 
     </ControlTemplate> 
    </UserControl.Resources> 

<TextBox Name="tbValue" Validation.ErrorTemplate="{StaticResource validationTemplate}"> 
14

Otra forma es simplemente no permitir valores que no sean enteros. La siguiente implementación es un poco sucky, y me gustaría resumirla más adelante para que sea más reutilizable, pero esto es lo que hice:

en el código en mi opinión (lo sé es que podría lastimar si usted es un MVVM incondicional; o)) he definido las siguientes funciones:

private void NumericOnly(System.Object sender, System.Windows.Input.TextCompositionEventArgs e) 
{ 
    e.Handled = IsTextNumeric(e.Text); 

} 


private static bool IsTextNumeric(string str) 
{ 
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[^0-9]"); 
    return reg.IsMatch(str); 

} 

Y en la vista XAML, cada caja de texto que sólo se suponía iba a aceptar enteros se definió como esto:

<TextBox Padding="2" TextAlignment="Right" PreviewTextInput="NumericOnly" Text="{Binding xxx.yyyy}" MaxLength="1" /> 

El atributo clave es PreviewTextInput

+2

esto no manejará los espacios en blanco. ¿cómo puedo manejar dem? –

+0

recortarlos más adelante? –

+1

IsTextNumeric devuelve verdadero para texto no numérico. Una solución más legible sería cambiar la expresión regular a [0-9] y establecer e.Handled =! IsTextNumeric, por lo que el evento se borra cuando el texto es numérico. Eso o cambie el nombre del método a IsTextNotNumeric :) –

8

Podemos hacer la validación en el evento de cambio de cuadro de texto. La siguiente implementación impide la entrada de pulsaciones de teclas que no sean numéricas y un punto decimal.

private void textBoxNumeric_TextChanged(object sender, TextChangedEventArgs e) 
{ 
     TextBox textBox = sender as TextBox; 
     Int32 selectionStart = textBox.SelectionStart; 
     Int32 selectionLength = textBox.SelectionLength; 
     String newText = String.Empty; 
     int count = 0; 
     foreach (Char c in textBox.Text.ToCharArray()) 
     { 
      if (Char.IsDigit(c) || Char.IsControl(c) || (c == '.' && count == 0)) 
      { 
       newText += c; 
       if (c == '.') 
        count += 1; 
      } 
     } 
     textBox.Text = newText; 
     textBox.SelectionStart = selectionStart <= textBox.Text.Length ? selectionStart : textBox.Text.Length;  
} 
+0

muy útil ...... –

+0

Muy útil. –

Cuestiones relacionadas