WPF: Как использовать украшения для валидации? - PullRequest
0 голосов
/ 18 сентября 2011

Контекст:

Я создаю интерфейс входа в систему, используя WPF 4, который состоит из двух Label s, одного TextBox (для имени пользователя) и одного PasswordBox,Оба элемента используют один и тот же стиль / шаблон.

Имя пользователя привязано к свойству Username в моем классе модели User, который создается в View-Model представления (которая представляет DataContext)

Пароль обновляет модель, используя события выделенного кода (т.е.: OnPasswordChanged).

У меня также есть два свойства в моей модели, которые представляют действительное состояние моего имени пользователя и пароля, т.е.:

  • UsernameIsValid
  • PasswordIsValid

Эти свойства обновлены моими классами View-Model и Service.

Вопрос:

Как я могу создать Adorner для этих элементов 'Style и отображать его, только когда свойства UsernameIsValid или PasswordIsValid имеют значение true?

Я бы также хотел, если возможно, передать в параметре текст, который будет отображаться в рекламном блоке (это будет выноска, которая отображает текст и значок)

1 Ответ

3 голосов
/ 18 сентября 2011

Уже поздно, поэтому код не предоставляется, но вы получите короткий ответ.

  1. Настройка проверки данных для свойств, к которым привязаны текстовые поля (интерфейс ValidationRule)
  2. Установить стиль по умолчаниюв текстовом поле с указанием того, каким оно должно быть при действительном
  3. Установите стиль, которым он должен быть при недействительном, с помощью триггера DataError.

Ниже показано, как получить код xaml для изменения стиля.

        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="BorderThickness" Value="1" />
                <Setter Property="Foreground" Value="Red" />
                <Setter 
                    Property="ToolTip" 
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
        </Style.Triggers>
...