2010-11-03 9 views
12

Je souhaite valider l'entrée de l'utilisateur afin de garantir qu'il s'agit d'entiers. Comment puis-je le faire? J'ai pensé utiliser IDataErrorInfo qui semble être la "bonne" manière de faire la validation dans WPF. J'ai donc essayé de l'implémenter, dans mon ViewModel.Autoriser uniquement les entrées numériques dans WPF Zone de texte

Mais la chose est que ma zone de texte est liée à un champ entier, et il n'y a pas besoin de valider si int est un int. J'ai remarqué que WPF ajoute automatiquement une bordure rouge autour de la zone de texte pour informer l'utilisateur de l'erreur. La propriété sous-jacente ne passe pas à une valeur non valide. Mais je voudrais en informer l'utilisateur. Comment puis-je le faire?

Répondre

11

La bordure rouge que vous avez vue est en fait un ValidationTemplate, que vous pouvez étendre et ajouter à l'utilisateur. Voir cet exemple:

<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

Une autre façon est simplement de ne pas autoriser les valeurs qui ne sont pas des entiers. La mise en œuvre suivante est un peu sucky, et je voudrais l'abstraire plus tard afin qu'il soit plus réutilisable, mais voici ce que j'ai fait:

dans le code derrière moi (je le sais est peut faire du mal si vous êtes un MVVM hardcore; o)) je définissais les fonctions suivantes:

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); 

} 

Et dans la vue XAML, chaque zone de texte qui ne devait accepter les entiers a été défini comme ceci:

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

L'attribut clé étant PreviewTextInput

+2

cela ne gèrera pas les espaces. comment puis-je gérer dem? –

+0

les rogner plus tard? –

+1

IsTextNumeric renvoie true pour les textes non numériques. Une solution plus lisible serait de changer l'expression rationnelle en [0-9] et de définir e.Handled =! IsTextNumeric, de sorte que l'événement est barboté lorsque le texte est numérique. Cela ou changer le nom de la méthode à IsTextNotNumeric :) –

8

Nous pouvons effectuer une validation sur l'événement modifié de la zone de texte. L'implémentation suivante empêche l'entrée de la touche autre que numérique et une décimale.

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

très utile ...... –

+0

Vraiment utile. –

Questions connexes