2010-05-11 3 views
2

을 호출되는 것을 방지한다. 또한 잘못된 규칙이있는 입력을 사용자에게 알리기 위해 유효성 검사 규칙을 사용하고 있습니다. 검증 오류는 속성 setter가 나는 다음과 같은 문제에 대한 간단한 솔루션을 찾고 있어요

... 여기에 에러 표시 스타일 ...

이제 데이터를 전송하기 위해 버튼을 누르면 할 수있는 텍스트 상자에 사용자가 유효한 데이터를 입력해야합니다. 단추를 클릭하면 코드 배후의 바운드 속성 UserName에서 데이터가 평가되고 전송됩니다.

문제는 사용자가 유효한 데이터를 TextBox에 입력 할 수 있으며이 속성은 UserName 속성에 설정된다는 것입니다. 그런 다음 사용자가 TextBox에서 텍스트를 변경하기로 결정하고 데이터가 유효하지 않게되면 유효성 검사 실패 후 UserName 속성의 setter가 호출되지 않습니다.

즉, 마지막 유효 데이터는 UserName 속성에 유지되고 TextBox는 오류 표시기와 함께 잘못된 데이터를 표시합니다. 그런 다음 사용자가 단추를 클릭하여 데이터를 보내면 현재 TextBox 내용 대신 마지막 유효한 데이터가 전송됩니다.

데이터가 유효하지 않고 실제로는 버튼을 비활성화 할 수 있지만이 메서드는 UserName의 setter에서 호출됩니다. 유효성 검사가 실패한 후에도 호출되지 않으면 버튼은 계속 활성화됩니다.

그래서 질문입니다. 유효성 검사 실패 후 속성 설정자를 호출하려면 어떻게해야합니까?

+0

어떻게 입력의 유효성을 검사합니까? 세터? 단추에 CommandBinding을 사용합니까? 몇 가지 샘플 코드를 제공 할 수 있습니까? – Jehof

+0

아니요, 명령 바인딩이 있습니까?setter에서 호출 된 유효성 검사 메서드는 바인딩 된 속성 값의 정확성을 간단히 확인하고 단추의 사용 가능 상태를 설정합니다. –

+0

@HA : 이것에 대한 해결책을 찾을 수 있었습니까? 나는 똑같은 문제를 겪고있다. 대답은 명확하지 않습니다. – user575219

답변

1

(DataErrorValidationRule을 통해) UI에 유효성 검사 오류를보고하고 특정 속성이 유효한지 여부를 확인하는 간단한 방법 (_Errors 확인) 및 전체보기 모델이 유효한지 여부를 알려주는 IsValid 속성을 알려줍니다. (또한 IsValid 속성을 확장하여 뷰 모델의 모든 속성이 유효하지만 뷰 모델 자체가 아닌 경우를 처리 할 수 ​​있습니다. 예를 들어 상호 배타적 인 두 플래그가 모두 설정됩니다.) 그리고 사용자가 internal을 만들면, 유효성 검사 방법은 NUnit 등을 통해 단위 테스트를 할 수 있습니다.

나는 위의 코드가 내 머리 꼭대기에서 벗어났다는 사실을 덧붙여 야한다. 필자의 실제 작업 코드는 기본 클래스에 있으며 다른 것들이 많이있다. 혼란 스럽다.

+0

고마워, Robert. 그것은 재미있어 보이고 나는 내일 자세히 보게 될 것이다. 지금까지 기존 코드를 사용하여 간단한 솔루션을 찾고 있습니다. –

1

유효성 검사 규칙에 대한 ValidationRule.ValidationStep 속성을 ValidationStep.UpdatedValue으로 설정할 수 있습니다. 먼저 원본을 업데이트 한 다음 유효성 검사를 수행합니다. 즉, 유효성 검사가 실패하더라도 속성 설정 기가 호출되어야합니다. 이 속성은 .NET 3.5 SP1 이상에서만 사용할 수 있습니다. 자세한 내용은 this blog post ("어떻게 사용합니까 (1 부)"단락 참조)를 참조하십시오.

public class MyViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private Dictionary<string, string> _Errors = new Dictionary<string, string>(); 

    public object SomeProperty 
    { 
     get { return _SomeProperty; } 
     set 
     { 
     if (value != _SomeProperty && !ValidationError("SomeProperty", value)) 
      _SomeProperty = value; 
      OnPropertyChanged("SomeProperty"); 
     } 
     } 
    } 

    private bool ValidationError(string propertyName, object value) 
    { 
     // I usually have a Dictionary<string, Func<object, string>> that maps property 
     // names to validation functions; the functions return null if the property 
     // is valid and an error message if not. You can embed the validation logic 
     // in the property setters, of course, but breaking them out as separate methods 
     // eases testing. 
     _Errors[propertyName] = _ValidationMethods[propertyName](value); 
     OnPropertyChanged("IsValid"); 
    } 

    public bool IsValid 
    { 
     get { return !(_Errors.Where(x => x.Value != null).Any())); 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
     return (_Errors.ContainsKey(propertyName)) 
      ? _Errors[propertyName] 
      : null; 
     } 
    } 
} 

그것은이 모든 처음에 설정 얻기 위해 조금 어색하지만 당신은 그것을 한 적이 한 번, 당신은 간단하고 직접적인 방법으로이 : 내보기 모델 클래스에서이를 처리하는 방법

+0

안녕하세요, 감사합니다. 부분적으로 만 작동하는 것 같습니다. setter가 호출되었지만 유효 한 데이터가 입력 되더라도 유효성 검사 오류가 사라지지 않습니다 ... –

+0

이것은 기본 동작이므로 상상할 수 없으므로 구현에 의해 발생할 수 있습니다. 그러나 어떤 코드도없이 당신을 도울 수 없습니다 ... 특히 당신이 당신의 의견을 위의 Jehof의 질문에 대해 이해함에 따라, 한번 ValidationRule을 사용하고 한번 속성 입력기에서 입력을 검증하는 것처럼 보이기 때문에! – gehho

+0

그래, 그건 사실이 아니고 최고의 디자인이 아니다. ValidationStep = "UpdatedValue"로 설정하면 유효성 검사 규칙의 Validate 메서드를 제외하고 BindingExpression 개체를받습니다. 이 값을 설정하지 않으면 Validate는 TextBox.Text 내용을 문자열로받습니다. –

관련 문제