WPF ValidationRule: как узнать, что я проверяю?

Хорошо, поэтому я попытался создать ValidationRule, чтобы убедиться, что заданная ширина элемента находится в заданном диапазоне для этого элемента. Вот моя попытка:

public class AdjustWidthValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        double dValue = (double)value;

        if (dValue < ??? || dValue > ???)
            return new ValidationResult(false, "Width is out of range!");

        return new ValidationResult(true, null);
    }
}

Хорошо, а как теперь мне узнать, какой элемент я должен проверять? Кажется, это поддерживает только жестко запрограммированные правила проверки и, похоже, не имеет никакого реального использования; вам нужен контекст для проверки. Я что-то не понимаю? Это только для возраста человека и длины поля? Должен ли я предоставлять статическую машину состояний? Это 1990-е? Я очень расстроен.


person Jordan    schedule 31.01.2011    source источник


Ответы (2)


В качестве альтернативы вы можете использовать IDataErrorInfo при проверке данных. Вот тема по этому поводу: Исключение проверки данных с помощью IDataErrorInfo с Реализация MVVM

person jpsstavares    schedule 31.01.2011
comment
Я только что понял это сам. :) - person Jordan; 31.01.2011

Вы проверяете объект «значение», который вы получаете в качестве аргумента. Вы должны знать, что это за объект. Чтобы сделать его более пригодным для повторного использования и не использовать жестко заданные значения, вы можете определить свойства в классе AdjustWidthValidationRule, например:

public class AdjustWidthValidationRule : ValidationRule
{
    public double Max { get; set; }
    public double Min { get; set; }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        double dValue = (double)value;

        if (dValue < Min || dValue > Max)
            return new ValidationResult(false, "Width is out of range!");

        return new ValidationResult(true, null);
    }
}

и вы можете указать значения Max и Min в своем xaml (или там, где вы создаете ValidationRule).

person Andrei Pana    schedule 31.01.2011
comment
Я создаю AdjustWidthValidationRule внутри XAML. Насколько я знаю, вы можете устанавливать свойства зависимостей для объектов зависимостей только из XAML. ValidationRule не является объектом зависимости. - person Jordan; 31.01.2011
comment
Я думаю, что понимаю, что вы говорите, но (к сожалению) ValidationRule не является DependencyObject, поэтому вы не можете привязываться, вы можете только давать значения. Однако есть трюк, чтобы как-то решить эту проблему (смотрите здесь: 11011.net/wpf-binding- properties), но в противном случае вам придется придерживаться более простой схемы проверки. - person Andrei Pana; 31.01.2011
comment
Спасибо, но я этого не принимаю. Этот метод проверки WPF непригоден для использования в реальном мире. Вся валидация основана на каком-то контексте, и не предлагать вообще никакого контекста для валидации — это просто плохой дизайн. - person Jordan; 31.01.2011