2010-11-03 28 views
12

Ich möchte Benutzereintrag überprüfen, um sicherzustellen, dass sie Ganzzahlen sind. Wie kann ich es tun? Ich dachte an die Verwendung von IDataErrorInfo, die wie die "richtige" Möglichkeit erscheint, die Validierung in WPF durchzuführen. Also habe ich versucht, es in meinem ViewModel zu implementieren.Nur numerische Eingabe in WPF zulassen Textfeld

Aber die Sache ist, mein Textfeld ist an ein ganzzahliges Feld gebunden, und es gibt keine Notwendigkeit zu validieren, wenn ein int ein int ist. Ich habe festgestellt, dass WPF automatisch einen roten Rahmen um das Textfeld hinzufügt, um den Benutzer über den Fehler zu informieren. Die zugrunde liegende Eigenschaft ändert sich nicht in einen ungültigen Wert. Aber ich möchte den Benutzer darüber informieren. Wie kann ich es tun?

Antwort

11

Der rote Rahmen, den Sie gesehen haben, ist ein ValidationTemplate, mit dem Sie eine Information für den Benutzer erweitern und hinzufügen können. Siehe dieses Beispiel:

<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

Eine andere Möglichkeit besteht einfach darin, keine Werte zuzulassen, die keine Ganzzahlen sind. Die folgende Implementierung ist ein wenig sucky, und ich würde zu abstrakt wie es für sie später um mehr wiederverwendbar zu sein, aber hier ist das, was ich getan habe:

im Code hinter meiner Meinung nach (ich weiß, das ist ist verletzen könnte, wenn Sie ein Hardcore-mvvm sind; o)) ich die folgenden Funktionen definiert: jede Textbox

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

} 

Und in der XAML-Ansicht, die nur sollte auf ganze Zahlen akzeptieren wurde wie folgt definiert:

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

Das Schlüsselattribut ist PreviewTextInput

+2

Dies wird nicht Leerzeichen behandeln. Wie kann ich mit dem umgehen? –

+0

trimmen sie später weg? –

+1

IsTextNumeric gibt true für nicht numerischen Text zurück. Eine besser lesbare Lösung wäre, die Regex auf [0-9] zu ändern und e.Handled =! IsTextNumeric zu setzen, damit das Ereignis bei numerischem Text durchgebrannt wird. Das oder ändern Sie den Methodennamen zu IsTextNotNumeric :) –

8

Wir können Validierung für Textbox geändert Ereignis. Die folgende Implementierung verhindert Keypress-Eingaben mit Ausnahme von numerischen und einem Dezimalpunkt.

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

sehr hilfreich ...... –

+0

Wirklich hilfreich. –

Verwandte Themen