我有一个简单的viewmodel类,它有两个属性:sEmailAddress和sEmailCompare。 我有一个带有两个文本框的简单视图(窗口)。数据上下文设置为viewmodel的实例。这两个文本框绑定到viewmodel上的两个属性,并设置了验证属性,如下所示:
Text="{Binding sEmailAddress,
Mode=TwoWay,
NotifyOnValidationError=True,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True}"
我的viewmodel有一个Validate方法,如下所示:
Public Function Validate() As Boolean
If Validator.TryValidateObject(Me, New ValidationContext(Me), New List(Of ValidationResult), True) Then
Return True
Else
Validator.ValidateObject(Me, New ValidationContext(Me), True)
Return False
End If
End Function
和数据注释属性:
Private _sEmailAddress As String
<Required>
Public Property sEmailAddress As String
Get
Return _sEmailAddress
End Get
Set(ByVal value As String)
If _sEmailAddress <> value Then
_sEmailAddress = value
OnPropertyChanged("sEmailAddress")
End If
End Set
End Property
Private _sEmailAddressConfirm As String
<Required>
<CustomValidation(GetType(MatchingEmailValidator), "ValidateEmail")>
Public Property sEmailAddressConfirm As String
Get
Return _sEmailAddressConfirm
End Get
Set(ByVal value As String)
If _sEmailAddressConfirm <> value Then
_sEmailAddressConfirm = value
OnPropertyChanged("sEmailAddressConfirm")
End If
End Set
End Property
实际验证部分正常工作 - 如果我将字段留空或者两个字段值不匹配,则TryValidateObject返回false。用户界面不会改变。所以我尝试调用ValidateObject,并且它会抛出一个验证异常,但是我不知道如何处理该异常,以便更新UI并且文本框以正常方式显示为红色。
有人能说清楚我在这里缺少什么吗?
答案 0 :(得分:1)
在Silverlight中有两种方法可以进行此类验证。第一种是在属性setter中抛出一个异常 - 因为你有ValidatesOnExceptions
= true,这会导致验证错误出现在UI上。要实现这一点,您基本上只需要在setter中调用ValidateObject
。
另一种方法,对于更高级的方案(即,可能存在依赖于多个属性的验证规则)非常有用,就是让您的视图模型实现INotifyDataErrorInfo
。此接口包含您维护的一组错误,以及添加或删除错误时需要调用的事件ErrorsChanged
。