Практическое руководство. Реализация проверки привязки

В этом примере показано использование ErrorTemplate и триггера стиля для предоставления визуальной обратной связи на основе настраиваемого правила проверки, предназначенной для уведомления пользователя о том, что введено недопустимое значение.

Пример

Текстовое содержимое TextBox в следующем примере привязано к свойству Age (типа int) объекта источника привязки ods. Привязка настроена на использование правила проверки AgeRangeRule таким образом, что при вводе нечисловых символов или значения меньше 21 или больше 130 рядом с текстовым полем появится красный восклицательный знак. Кроме того, когда пользователь поместит указатель мыши над текстовым полем, отобразится всплывающая подсказка с сообщением об ошибке.

<TextBox Name="textBox1" Width="50" FontSize="15"
         Validation.ErrorTemplate="{StaticResource validationTemplate}"
         Style="{StaticResource textBoxInError}"
         Grid.Row="1" Grid.Column="1" Margin="2">
  <TextBox.Text>
    <Binding Path="Age" Source="{StaticResource ods}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

В следующем примере показана реализация объекта AgeRangeRule, который наследуется от ValidationRule и переопределяет метод Validate. Метод Int32.Parse() вызывается для значения, чтобы убедиться, что оно не содержит недопустимых символов. Метод Validate возвращает ValidationResult, который указывает на допустимость значения на основе того, было ли перехвачено исключение при синтаксическом анализе и не выходит ли оно за пределы нижней и верхней границы.

public class AgeRangeRule : ValidationRule
{
    private int _min;
    private int _max;

    public AgeRangeRule()
    {
    }

    public int Min
    {
        get { return _min; }
        set { _min = value; }
    }

    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = Int32.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, "Illegal characters or " + e.Message);
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              "Please enter an age in the range: " + Min + " - " + Max + ".");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}

В следующем примере показан пользовательский ControlTemplate validationTemplate, который создает красный восклицательный знак для уведомления пользователя об ошибке проверки. Шаблоны элемента управления используются для переопределения внешнего вида элемента управления.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Как показано в следующем примере, ToolTip, отображающий сообщение об ошибке, создается с использованием стиля textBoxInError. Если значение HasError равно true, триггер задает подсказке текущего TextBox значение первой ошибки проверки. RelativeSource устанавливается в значение Self, указывающее на текущий элемент.

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Полный пример см. в разделе Пример проверки данных с использованием привязки.

Обратите внимание, что если не предоставляется пользовательский ErrorTemplate, то отображается шаблон ошибки по умолчанию для предоставления пользователю отчета о том, что произошла ошибка проверки. См. подраздел «Проверка данных» в разделе Общие сведения о связывании данных для получения дополнительных сведений. Кроме того, WPF предоставляет встроенное правило проверки, которое отслеживает исключения, созданные во время обновления свойства источника привязки. Дополнительные сведения см. в разделе ExceptionValidationRule.

См. также

Основные понятия

Общие сведения о связывании данных

Другие ресурсы

Практические руководства по привязке данных