代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

是否将验证错误传递到WPF中的UI元素?

  •  1
  • Tony The Lion  · 技术社区  · 14 年前

    我正在使用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 回复  |  直到 14 年前
        1
  •  2
  •   Nathan Tregillus    14 年前

    当窗体被绑定时,您是否看到了输出窗口?通过在绑定发生时查看输出,可以发现大量的验证问题。

    还有一个简短的说明:

    使用

    Path=(Validation.Errors).CurrentItem.ErrorContent

    而不是

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

    当向控件提供有效值时,它将为您保存一些进一步的绑定溢出

        2
  •  1
  •   Tri Q Tran    14 年前

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

    该样式需要定义“validation.errorTemplate”的控件模板,以便在发生验证错误时使用。尝试进行以下更改以查看进展情况。

    保罗·斯托维尔在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>