Есть ли способ заставить текстовое поле XAML проверяться на int или double без пользовательских ValidationRules? - PullRequest
0 голосов
/ 22 октября 2009

У меня есть несколько текстовых полей XAML , которым нужно разрешить только, кроме double , и некоторые, которым нужно разрешить ничего, кроме int .

Я мог бы использовать Binding.ValidationRules со всем его кодом позади, триггерами, стилями как , описанным здесь , но нет способа для этих простых проверки для использования атрибута примерно так, просто ничего, кроме этого типа, не может быть напечатано:

псевдокод:

<TextBox Text="{Binding NumberOfContracts}" SimpleValidation="{x:Type sys:Integer}"/>
<TextBox Text="{Binding ContractPrice}" SimpleValidation="{x:Type sys:Double}"/>

1 Ответ

2 голосов
/ 23 октября 2009

Я всегда думал о чем-то столь же полезном, как это, но теперь, когда я прочитал ваш вопрос, я нашел время написать его.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace SimpleValidation
{
    public class SimpleValidator : ValidationRule
    {

        #region Validation Attached Property

        public static Type GetValidationType(DependencyObject obj)
        {
            return (Type)obj.GetValue(ValidationTypeProperty);
        }

        public static void SetValidationType(DependencyObject obj, Type value)
        {
            obj.SetValue(ValidationTypeProperty, value);
        }

        // Using a DependencyProperty as the backing store for ValidationType.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValidationTypeProperty =
            DependencyProperty.RegisterAttached("ValidationType", typeof(Type), typeof(ValidationRule), new UIPropertyMetadata(null, OnValidationTypeChanged));

        private static void OnValidationTypeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            var element = obj as FrameworkElement;
            if (element == null) return;

            // When the element has loaded.
            element.Loaded += (s, e) =>
                                  {
                                      // Create a new validator
                                      var validation = new SimpleValidator(args.NewValue as Type);
                                      // Get the binding expression for the textbox property
                                      var binding = BindingOperations.GetBinding(obj, TextBox.TextProperty);
                                      // If not null and doesn't already contain the validator, then add it.
                                      if (binding != null)
                                          if (!binding.ValidationRules.Contains(validation))
                                              binding.ValidationRules.Add(validation);
                                  };
        }

        #endregion


        #region Validation

        public SimpleValidator() { }
        public SimpleValidator(Type validationType)
        {
            ValidationType = validationType;
        }

        public Type ValidationType { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            try
            {
                // Try to convert to the type specified
                Convert.ChangeType(value, ValidationType);
                // Accept value
                return new ValidationResult(true, "Valid value");
            }
            catch (Exception)
            {
                // return invalid type error.
                return new ValidationResult(false, "Value is not of type " + ValidationType.FullName);
            }
        }

        #endregion

    }
}

Пример использования:

<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" validator:SimpleValidator.ValidationType="{x:Type system:Double}" />

Убедитесь, что UpdateSourceTrigger отражает тип обновления, который вам требуется, обычно лучше всего использовать PropertyChanged. Я надеюсь, вам понравится так же, как я пишу это. Полный исходный код здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...