我正在使用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>
验证发生,但数据无效时要应用的样式不会发生。
答案 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>