在我的应用程序中,我有一个实现IDataError的模型和视图模型,这一切都可以工作,但是例如当我打开视图添加新客户时,如果我的验证规则要求名字和姓氏不为空或者为空,则立即评估这些验证并且用户看到表单有错误,要求他们输入这些数据。如何才能显示干净的输入表单,但在属性更改或输入丢失焦点时仍显示验证?
答案 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中的验证。
如果您希望让用户可以自由地以随机顺序输入字段,则无法按照您描述的方式进行输入验证(失去焦点)。
我看到两种可接受的方式: