2014-07-09 3 views
1

두 가지 속성 : sEmailAddress 및 sEmailCompare를 가진 간단한 viewmodel 클래스가 있습니다. 두 개의 텍스트 상자가있는 간단한보기 (창)가 있습니다. 데이터 컨텍스트는 viewmodel의 인스턴스로 설정됩니다. 다음과 같이 두 개의 텍스트 상자는 설정 유효성 검사 속성, 뷰 모델의 두 가지 속성에 바인딩 :Silverlight 데이터 유효성 검사 사용자 지정 클라이언트 쪽 클래스

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 

그리고 데이터 주석 속성을 다음과 같이

Text="{Binding sEmailAddress, 
          Mode=TwoWay, 
          NotifyOnValidationError=True, 
          UpdateSourceTrigger=PropertyChanged, 
          ValidatesOnDataErrors=True, 
          ValidatesOnExceptions=True}" 

내 뷰 모델은 유효성 검사 방법이있다 : 나는 빈 필드를 떠날 경우

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 

실제 검증 부분

이 correctly- 작업 또는 두 필드 값이 일치하지 않는 경우, 다음 TryValidateObject false를 반환합니다. 그러나 UI는 변하지 않습니다. 그래서 ValidateObject를 호출 해 봅니다. 유효성 검사 예외를 throw합니다. 그렇지만 UI가 업데이트되고 텍스트 상자가 정상적으로 빨간색으로 윤곽이 그려지도록 예외를 처리하는 방법을 알지 못합니다.

내가 누락 된 부분에 대해 알려 주실 분 있나요?

답변

1

Silverlight에서 이러한 종류의 유효성 검사를 수행하는 방법에는 두 가지가 있습니다. 첫 번째는 ValidatesOnExceptions = true이므로 UI에서 유효성 검사 오류가 발생해야하므로 속성 설정자 내에 예외가 발생합니다. 이를 구현하려면 기본적으로 ValidateObject을 호출해야합니다.

더 많은 고급 시나리오 (예 : 여러 속성에 따라 유효성 검사 규칙이있을 수 있음)에 유용한 다른 방법은보기 모델을 INotifyDataErrorInfo으로 구현하는 것입니다. 이 인터페이스에는 유지 관리하는 오류 콜렉션이 있으며 오류가 추가 또는 제거 될 때 호출해야하는 이벤트 ErrorsChanged이 있습니다.

+0

답변 해 주셔서 감사합니다. 따라서 ValidateObject 메서드를 Validate 메서드로 호출하면 내가 잘못하고있는 것처럼 보일 것입니다. ValidateObject 메서드를 setter로 이동하면 UI가 표준 유효성 검사를받습니다. 아마도 Setter에서 할 때 ValidateObject 대신 ValidateProperty를 사용해야 할 것입니다. – Josh

+0

@Josh 예, 그게 더 합리적입니다. – McGarnagle

관련 문제