2010-11-03 71 views
12

Tôi muốn xác thực mục nhập của người dùng để đảm bảo chúng là số nguyên. Tôi làm nó như thế nào? Tôi nghĩ đến việc sử dụng IDataErrorInfo mà có vẻ như cách "đúng" để thực hiện xác nhận trong WPF. Vì vậy, tôi đã thử triển khai nó, trong ViewModel của tôi.Chỉ cho phép nhập số vào Hộp văn bản WPF

Nhưng vấn đề là hộp văn bản của tôi bị ràng buộc vào trường số nguyên và không cần xác thực nếu intint. Tôi nhận thấy rằng WPF tự động thêm đường viền màu đỏ xung quanh hộp văn bản để thông báo cho người dùng về lỗi. Thuộc tính cơ bản không thay đổi thành giá trị không hợp lệ. Nhưng tôi muốn thông báo cho người dùng về điều này. Tôi làm nó như thế nào?

Trả lời

11

Đường viền màu đỏ mà bạn đã thấy thực sự là một ValidationTemplate, mà bạn có thể mở rộng và thêm thông tin cho người dùng. Xem ví dụ này:

<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

Một cách khác đơn giản là không cho phép các giá trị không phải là số nguyên. Việc thực hiện sau đây là một chút sucky, và tôi muốn tóm tắt nó sau này để cho nó có thể tái sử dụng nhiều hơn, nhưng đây là những gì tôi đã làm:

trong mã phía sau trong quan điểm của tôi (Tôi biết điều này là có thể bị tổn thương nếu bạn là một MVVM Hardcore; o)) tôi xác định các chức năng sau:

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

} 

Và trong giao diện XAML, mỗi textbox mà chỉ phải chấp nhận số nguyên được định nghĩa như thế này:

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

Thuộc tính khóa là PreviewTextInput

+2

điều này sẽ không xử lý các khoảng trống. làm thế nào tôi có thể xử lý dem? –

+0

cắt chúng sau này? –

+1

IsTextNumeric trả về true cho văn bản không phải là số. Một giải pháp dễ đọc hơn sẽ là thay đổi regex thành [0-9] và đặt e.Handled =! IsTextNumeric, vì vậy sự kiện này được phát ra khi văn bản là số. Điều đó hoặc thay đổi tên phương thức thành IsTextNotNumeric :) –

8

Chúng tôi có thể thực hiện xác thực trên sự kiện đã thay đổi hộp văn bản. Việc triển khai sau ngăn chặn đầu vào nhấn phím khác với số và một dấu thập phân.

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

rất hữu ích ...... –

+0

Thực sự hữu ích. –

Các vấn đề liên quan