关于WPF验证;

时间:2012-01-27 07:06:09

标签: wpf validation

在我的应用程序中,我有一个实现IDataError的模型和视图模型,这一切都可以工作,但是例如当我打开视图添加新客户时,如果我的验证规则要求名字和姓氏不为空或者为空,则立即评估这些验证并且用户看到表单有错误,要求他们输入这些数据。如何才能显示干净的输入表单,但在属性更改或输入丢失焦点时仍显示验证?

3 个答案:

答案 0 :(得分:1)

如果您实施IDataErrorInfo,为什么要使用验证规则?

答案 1 :(得分:1)

首先,如果你的规则说第一个和最后一个名字不应该是空的 - 用户看到验证错误的权利。

我所做的是使用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>

答案 2 :(得分:0)

在这种情况下,您实施的验证是错误的。在其他情况下,LastName属性在此方案中不能为空,但允许使用。

不允许的是使用空字段保存客户。

因此,您必须相应地调整此ViewModel中的验证。

如果您希望让用户可以自由地以随机顺序输入字段,则无法按照您描述的方式进行输入验证(失去焦点)。

我看到两种可接受的方式:

  1. 保持输入/字段验证,但减少在脸上;只是文本框旁边的一个简单标记。
  2. 单击“保存”按钮并在UI中设置错误时,验证Cutomer对象。您甚至可以编写SaveCommand的CanExecute代码,但这可能会使验证(我何时可以保存,我做错了什么)更加模糊。