自定义客户端类的Silverlight数据验证

时间:2014-07-09 20:57:40

标签: silverlight

我有一个简单的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并且文本框以正常方式显示为红色。

有人能说清楚我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

在Silverlight中有两种方法可以进行此类验证。第一种是在属性setter中抛出一个异常 - 因为你有ValidatesOnExceptions = true,这会导致验证错误出现在UI上。要实现这一点,您基本上只需要在setter中调用ValidateObject

另一种方法,对于更高级的方案(即,可能存在依赖于多个属性的验证规则)非常有用,就是让您的视图模型实现INotifyDataErrorInfo。此接口包含您维护的一组错误,以及添加或删除错误时需要调用的事件ErrorsChanged