Проверка в текстовом поле в WPF

Свойства должны только быть простым набором и получить лайнеры. Что-либо больше и это должно действительно быть перемещено в метод. Сложный код должен всегда быть в методах.

10
задан Abel 9 August 2011 в 17:19
поделиться

2 ответа

Вы можете ограничить ввод числами только с помощью присоединенного свойства в TextBox. Определите прикрепленное свойство один раз (даже в отдельной dll) и используйте его в любом TextBox. Вот прикрепленное свойство:

   using System;
   using System.Windows;
   using System.Windows.Controls;
   using System.Windows.Input;

   /// <summary>
   /// Class that provides the TextBox attached property
   /// </summary>
   public static class TextBoxService
   {
      /// <summary>
      /// TextBox Attached Dependency Property
      /// </summary>
      public static readonly DependencyProperty IsNumericOnlyProperty = DependencyProperty.RegisterAttached(
         "IsNumericOnly",
         typeof(bool),
         typeof(TextBoxService),
         new UIPropertyMetadata(false, OnIsNumericOnlyChanged));

      /// <summary>
      /// Gets the IsNumericOnly property.  This dependency property indicates the text box only allows numeric or not.
      /// </summary>
      /// <param name="d"><see cref="DependencyObject"/> to get the property from</param>
      /// <returns>The value of the StatusBarContent property</returns>
      public static bool GetIsNumericOnly(DependencyObject d)
      {
         return (bool)d.GetValue(IsNumericOnlyProperty);
      }

      /// <summary>
      /// Sets the IsNumericOnly property.  This dependency property indicates the text box only allows numeric or not.
      /// </summary>
      /// <param name="d"><see cref="DependencyObject"/> to set the property on</param>
      /// <param name="value">value of the property</param>
      public static void SetIsNumericOnly(DependencyObject d, bool value)
      {
         d.SetValue(IsNumericOnlyProperty, value);
      }

      /// <summary>
      /// Handles changes to the IsNumericOnly property.
      /// </summary>
      /// <param name="d"><see cref="DependencyObject"/> that fired the event</param>
      /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param>
      private static void OnIsNumericOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      {
         bool isNumericOnly = (bool)e.NewValue;

         TextBox textBox = (TextBox)d;

         if (isNumericOnly)
         {
            textBox.PreviewTextInput += BlockNonDigitCharacters;
            textBox.PreviewKeyDown += ReviewKeyDown;
         }
         else
         {
            textBox.PreviewTextInput -= BlockNonDigitCharacters;
            textBox.PreviewKeyDown -= ReviewKeyDown;
         }
      }

      /// <summary>
      /// Disallows non-digit character.
      /// </summary>
      /// <param name="sender">The source of the event.</param>
      /// <param name="e">An <see cref="TextCompositionEventArgs"/> that contains the event data.</param>
      private static void BlockNonDigitCharacters(object sender, TextCompositionEventArgs e)
      {
         foreach (char ch in e.Text)
         {
            if (!Char.IsDigit(ch))
            {
               e.Handled = true;
            }
         }
      }

      /// <summary>
      /// Disallows a space key.
      /// </summary>
      /// <param name="sender">The source of the event.</param>
      /// <param name="e">An <see cref="KeyEventArgs"/> that contains the event data.</param>
      private static void ReviewKeyDown(object sender, KeyEventArgs e)
      {
         if (e.Key == Key.Space)
         {
            // Disallow the space key, which doesn't raise a PreviewTextInput event.
            e.Handled = true;
         }
      }
   }

Вот как его использовать (замените «control» своим собственным пространством имен):

<TextBox controls:TextBoxService.IsNumericOnly="True" />
23
ответ дан 3 December 2019 в 15:52
поделиться

Вы можете поместить проверку в свою привязку

<TextBox>
         <TextBox.Text>
              <Binding Path="CategoriaSeleccionada.ColorFondo"
                       UpdateSourceTrigger="PropertyChanged">
                     <Binding.ValidationRules>
                           <utilities:RGBValidationRule />
                     </Binding.ValidationRules>
               </Binding>
         </TextBox.Text>
</TextBox>

Посмотрите на этот пример (моей программы), вы помещаете проверку внутри привязки, как это. С помощью UpdateSourceTrigger вы можете изменить, когда ваша привязка будет обновлена ​​(теряется фокус, при каждом изменении ...)

Что ж, проверка - это класс, я приведу вам пример:

class RGBValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        // Here you make your validation using the value object.
        // If you want to check if the object is only numbers you can
        // Use some built-in method
        string blah = value.ToString();
        int num;
        bool isNum = int.TryParse(blah, out num);

        if (isNum) return new ValidationResult(true, null);
        else return new ValidationResult(false, "It's no a number");
    }
}

Короче говоря, выполняйте работу внутри этот метод и верните новый ValidationResult. Первый параметр - это логическое значение: истина, если проверка прошла успешно, и ложь, если нет. Второй параметр - это всего лишь информационное сообщение.

Я думаю, что это основы проверки текстовых полей.

Надеюсь на эту помощь.

РЕДАКТИРОВАТЬ: Извините, я не знаю VB.NET, но я думаю, что код C # довольно прост.

4
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: