2009-08-06 3 views
1

Silverlight 3에서는 MVVM 및 유효성 검사 오류가 발생할 경우 setters가 예외를 발생시키는 유효성 검사 원리로 작업하고 있습니다. 내가 사용하는 필드에 바인딩 구문을 사용하여 양방향 예 : Silverlight의 ValidationSummary에 닫기 단추를 추가하는 방법

<TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}" Grid.Column="1" Grid.Row="0" Margin="5 5 5 5" /> 

내가 주석을 사용하여 뷰 모델에서이 속성을 확인 :
[Required(ErrorMessage = "Name is required")] 
public string Name 
{ 
    get 
    { 
     return _client.Name; 
    } 
    set 
    { 
     Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name", DisplayName="Client Name" }); 
     _client.Name = value; 
    } 
} 

내가 유효성 검사 요약이 있고 모두 잘 작동하지만, 롤 내가 찾고있는 기능은 다음과 같습니다.

데이터 폼이 있으며 저장을 클릭 할 때만 유효성 검사 요약이 맨 위에 표시되도록하고 그 이상의 ValidationSummary에 닫기 단추를 구현하려면 사용자는 enter를 계속할 수 있습니다. 고침.

나는 validationsummary의 가시성이나 토글을 제어하는 ​​방법을 모르겠다. Visibility를 시도했다. 다음은 제출에 오류를 수집하지 않습니다 내가 노력 코드입니다,하지만 난의 ValidationSummary에 적용 할 수 없습니다

public void Save() 
    { 
     List<ValidationError> errors = new List<ValidationError>(); 

     foreach (UIElement ui in LayoutRoot.Children) 
     { 
      FrameworkElement fe = ui as FrameworkElement; 

      if (fe != null) 
      { 
       foreach (ValidationError ve in Validation.GetErrors(fe)) 
       { 
        errors.Add(ve); 
       } 
      } 
     } 


     if (errors.Count > 0) 
     { 

      Validation1.DataContext = errors; 
      Validation1.Filter = ValidationSummaryFilters.All; 
     } 
     else 
     { 
      if (Saved != null) 
       Saved(this, EventArgs.Empty); 
     } 

    } 

건배,

앤드류

답변

1

내 생각이 지금 당신 '에 의해 귀하의 애플 리케이션에서 SIlverlight 4를 사용합니다. 그래서이 답변이 새로운 인터페이스는 3 개 방법으로 INotifyDataError을 첨가하여 실버 라이트 4를 실버 라이트 4

입니다 : 해당 인터페이스 및 사용 방법에 대한 웹 주위 광대 한 문서가있다

public interface INotifyDataErrorInfo 
{ 
    // Returns True if the object has at least one property-level or top-level error. 
    bool HasErrors { get; } 

    // Returns the current set of property-level errors for the provided property name, or 
    // the current top-level errors if the argument is null or empty. 
    IEnumerable GetErrors(string propertyName); 

    // Raised when the set of errors for a particular property has changed, or when the 
    // top-level errors have changed. 
    event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; 
} 

.

원하지 않는 경우 DataAnotations를 사용할 필요가 없습니다. 하지만 그래도한다면 System.ComponentModel.DataAnnotations 네임 스페이스의 Validator 클래스를 사용하여 유효성 검사 오류를 얻을 수 있습니다.

ViewModel을 INotifyDataError으로 구현하고 ViewModel에서 bool IsValidating 또는 그와 비슷한 속성을 사용하는 경우. 그런 다음 속성이 변경 될 때마다 유효성을 검사 할 모든 속성에 대해 ErrorsChanged 이벤트를 발생시킵니다 (리플렉션을 사용하여 속성 이름을 가져올 수 있음). 그리고 그게 다야.

이제 IsValidating = false 만 입력하면 저장이 요청되면 IsValidating = true과 함께 오류가 표시됩니다.

다른 당신이 할 수있는 일 (이 실버 라이트 3에 작동합니다)는 IsValidating 속성 (A IValueConverter를 사용)에의 ValidationSummary의 가시성을 결합, 다음 뷰 모델에서이 제어된다.

관련 문제