当我第一次向用户显示我的屏幕时,我宁愿在用户有机会填写任何表单字段之前没有显示所有必需字段的验证消息.我已经设置了UpdateSourceTrigger我的绑定LostFocus,但是第一次显示控件时仍然会显示错误.有没有办法解决这个问题?
XAML:
<TextBox Text="{Binding Path=OpeningOdometer, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" />
Run Code Online (Sandbox Code Playgroud)
视图模型:
[Required(ErrorMessage = "Please enter the opening odometer.")]
[Range(0, Double.MaxValue, ErrorMessage = "Opening Odometer must be a positive number")]
public string OpeningOdometer
{
get { return _openingOdometer; }
set
{
_openingOdometer = value;
NotifyOfPropertyChange(() => OpeningOdometer);
}
}
// Implementation of IDataErrorInfo
public string this[string columnName]
{
get
{
// This uses the System.ComponentModel.DataAnnotations placed on
// the OpeningOdometer property to produce an error string
// if the value of the property is in violation of any of the
// annotated rules.
return _valHelper.GetErrorsForProperty(columnName, this);
}
}
Run Code Online (Sandbox Code Playgroud)
我没有将验证逻辑放在索引器中.这将控制验证的时间到视图.在您的方案中,视图会在询问属性的错误信息时触发验证.我不知道会发生什么事情,我敢打赌你也不会.
相反,我在其setter中放置了属性的验证逻辑(更准确地说,是对验证函数的调用).我将错误消息存储在键入属性名称的字典中,并让索引器查找该属性的错误消息.
默认情况下,错误消息是最新的属性的当前值.每当视图更新属性并请求其新的错误信息时,它都会得到正确的答案.
但是你也可以对字典中的实际内容进行相当精细的控制.如果您希望属性在UI中显示为有效,只需在字典中清除其错误消息(并提升PropertyChanged,以便UI知道获取新的错误消息).或者,您可以在构造视图模型对象时设置属性的支持字段而不是属性本身,从而绕过验证.
如果您努力发布相关代码/XAML 的片段,您可以获得更好的答案。这将使重现变得更容易,并消除大部分猜测。
尝试设置ValidatesOnTargetUpdated="False"您的验证规则,看看是否有帮助。