Show / Hide Table of Contents

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

В этом примере показано, как использовать 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
{
    public int Min { get; set; }
    public int Max { get; set; }

    public AgeRangeRule()
    {
    }

    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}.");
        }
        return ValidationResult.ValidResult;
    }
}

В следующем примере показано пользовательский 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

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

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

См. также

  • Общие сведения о привязке данных
  • Практические руководства
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX