передать ошибку проверки в элемент пользовательского интерфейса в WPF? - PullRequest
1 голос
/ 16 марта 2010

Я использую IDataErrorInfo для проверки моих данных в форме в WPF.У меня есть проверка, выполненная в моем докладчике.

Фактическая проверка выполняется, но XAML, который должен обновить интерфейс и установить стиль, не выполняется.

Вот оно:

  <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}"/>
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
        </Style.Triggers>
    </Style>

Проблема в том, что моя привязка к Validation.Errors не содержит данных.Как получить эти данные из класса Presenter и передать их в этот XAML, чтобы обновить элементы пользовательского интерфейса?

РЕДАКТИРОВАТЬ:

Текстовое поле:

 <TextBox Style="{StaticResource textBoxInError}" Name="txtAge" Height="23" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Width="150">
            <TextBox.Text>
                <Binding Path="StrAge" Mode="TwoWay"
                         ValidatesOnDataErrors="True"
                         UpdateSourceTrigger="PropertyChanged"/>
            </TextBox.Text>

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

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Вы смотрели окно вывода, как ваша форма привязана? значительное количество проблем с проверкой можно найти, просмотрев выходные данные по мере связывания.

Также одна быстрая заметка:

использовать

Path=(Validation.Errors).CurrentItem.ErrorContent

вместо

Path=(Validation.Errors)[0].ErrorContent

Это избавит вас от некоторых дополнительных исключений привязки, когда для элемента управления будет предоставлено действительное значение

1 голос
/ 16 марта 2010

Я заметил, что твой стиль еще не закончен.

Для стиля требуется шаблон элемента управления, который определяет «Validation.ErrorTemplate», чтобы он работал при возникновении ошибки проверки. Попробуйте внести следующие изменения, чтобы увидеть, как это происходит.

У Пола Стоуэлла есть очень хорошая статья о проверке WPF здесь , которая охватывает большинство вещей, которые вам нужны. Я также написал статью здесь , чтобы упростить проверку, которая вам также может понравиться.

до

<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}"/>
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

ПОСЛЕ

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