将验证错误传递给WPF中的UI元素?

时间:2010-03-15 21:14:25

标签: c# wpf validation mvp idataerrorinfo

我正在使用IDataErrorInfo来验证WPF中表单中的数据。我在演示者中实现了验证。

实际验证正在进行,但是应该更新UI并设置样式的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以更新UI元素?

编辑:

文本框:

 <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 个答案:

答案 0 :(得分:2)

您是否在表单绑定时观看了输出窗口?通过在绑定发生时查看输出,可以找到大量验证问题。

还有一个快速说明:

使用

Path=(Validation.Errors).CurrentItem.ErrorContent

而不是

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

当为控件提供有效值时,它将为您节省一些额外的绑定

答案 1 :(得分:1)

我注意到你的风格还没有完全结束。

Style需要一个控件模板,该模板定义“Validation.ErrorTemplate”,以便在发生验证错误时使用它。尝试进行以下更改以查看其进展情况。

Paul Stovell有一篇关于WPF验证的非常好的文章here,它将涵盖您需要的大部分内容。我还写了一篇文章here来简化你可能也喜欢的验证。

<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>