относительно валидации WPF; - PullRequest
2 голосов
/ 27 января 2012

В моем приложении есть модель и модель представления, которые реализуют IDataError, все это работает, но, например, когда я открываю представление для добавления нового клиента, если мое правило проверки требует, чтобы имя и фамилия не были нулевыми или пустыми, эти проверки немедленно оцениваются ипользователь видит форму с ошибками, прося их ввести эти данные.Как я могу просто показать чистую форму ввода, но по-прежнему показывать проверку при изменении свойства или ввода потерял фокус?

Ответы [ 3 ]

1 голос
/ 27 января 2012

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

Что я сделал, так это использовал ValidationTemplate для пустых значений, чтобы пользователь просто увидел «*» для обязательного поля.

<ControlTemplate x:Key="ValidationTemplateEmpty" >
    <DockPanel>
        <TextBlock Text="*" Margin="0,0,3,0" Foreground="Red" Visibility="{Binding ElementName=MyAdornedElement,Path=AdornedElement.Visibility}"
                   ToolTip="{Binding ElementName=MyAdornedElement,Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"/>
        <AdornedElementPlaceholder Name="MyAdornedElement" />
    </DockPanel>
</ControlTemplate>

<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationTemplate}"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="Black"/>
        </Trigger>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors).CurrentItem.ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
            <Setter Property="Background" Value="{StaticResource BrushErrorLight}" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="Validation.HasError" Value="true"/>
                <Condition Property="Text" Value=""/>
            </MultiTrigger.Conditions>
            <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationTemplateEmpty}"/>
            <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors).CurrentItem.ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
        </MultiTrigger>
    </Style.Triggers>
</Style>
1 голос
/ 27 января 2012

Если вы реализуете IDataErrorInfo, почему вы используете правило проверки?

0 голосов
/ 27 января 2012

В этом сценарии вы провели неверную проверку. Хотя в других ситуациях свойство LastName не может быть пустым, в этом сценарии оно разрешено.

Недопустимо сохранение клиента с пустыми полями.

Таким образом, вы должны соответствующим образом настроить свою проверку в этой ViewModel.

Иметь валидацию ввода в том виде, в каком вы ее описываете (потерянный фокус), невозможно, если вы хотите предоставить пользователю свободу ввода полей в случайном порядке.

Я вижу два приемлемых способа:

  1. Сохраняйте правильность ввода / поля, но уменьшайте его на вашем лице ; просто отметка рядом с текстовым полем.
  2. Проверка объекта Cutomer при нажатии кнопки Сохранить и установке ошибок в пользовательском интерфейсе. Вы даже можете кодировать CanExecute команды SaveCommand, но это может сделать проверку (когда я могу сохранить, что я сделал не так) более неясной.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...