2017-03-25 6 views
0

내 모델이 INotifyDataErrorInfo 인터페이스를 구현하여 해당 속성의 유효성을 검사하고 정상적으로 작동하지만 문제는 HasErrors 속성이 기본적으로 false이므로 처음으로 앱을 실행하고 저장을 클릭합니다. (양식이 비어 있음) 뷰가 오류를 발생시키지 않고 데이터가 저장됩니다. 여기 INotifyDataErrorInfo를 사용하여 Mvvm 모델 유효성 검사

내 뷰 모델

public LoggingViewModel() 
{ 
    _loggingCommand = new RelayCommand(checkCredentials, canExecuteLogginForm); 
    _logingModel = new LoggingModel(); 

    // I raise this event in the 'OnErrorsChanged' method in the model, 
    // so my ViewModel can subscribe and check the 'HasErrors' property. 
    _logingModel.FormIsValid += (o, e) => _loggingCommand.RaiseCanExecuteChanged(); 
} 

private bool canExecuteLogginForm() 
{ 
    return !_logingModel.HasErrors; 
} 

의 snipet 어떻게 앱이 상황을 처리 할 것입니다?

자세한 내용은이 github repos를 만들었습니다.

+0

기본적으로 HasErrors가 참이므로 코드를 업데이트 할 수 있습니까? LogginModel 생성자에서 유효성 검사 또는 유효성 검사를 수행 하시겠습니까? – robaudas

+0

HasErrors는 INotifyDataErrorInfo 인터페이스의 멤버이며 폼에 오류가 없으면 false를 반환해야합니다. 검증을 어떻게 강제 할 수 있습니까? –

답변

1

원래 당신이 그것을 정상적으로 true를 반환 할 HasErrors 속성에 대한 위해 실제로 그것의 생성자에서 ValidateForm() 메소드를 호출이 상태로 설정하고 _ errors 사전을 채워야 유효하지 않은 상태에서 실제로 :

public class LoggingModel : PocoBase 
{ 
    public LoggingModel() 
    { 
     ValidateForm(); 
    } 

    [Display(Name = "Name")] 
    [MaxLength(32), MinLength(4)] 
    public string UserName 
    { 
     get { return GetValue<string>(); } 
     set { SetValue(value); } 
    } 

    [Required] 
    public string Password 
    { 
     get { return GetValue<string>(); } 
     set { SetValue(value); } 
    } 
} 
0

ViewModel 논리가 정확합니다.
HasErrors = true 일 때 HasErrors = False를 반환하는 모델 내부의 유효성 검사 논리에 문제가 있습니다.

HasErrors를 설정/리턴/평가하는 방법을 살펴보십시오.
모델에서 속성 확인 중입니까?

public bool HasErrors 
    { 
     get 
     { 
      bool hasErrors = false; // Default true here? 

      // Validation logic ... 

      return hasErrors; 
     } 
    } 

속성에 HasError 값을 저장하고 다른 곳에 설정합니까? 당신은 내가 더 좋은 대답을 줄 수 INotifyDataErrorInfo 유효성 검사를 처리하는 방법에 대한 구조를 보여줄 수 있다면 내가 말했듯이 그냥 몇 가지 아이디어

public LoggingModel() 
    { 
     HasErrors = true; // Default true here? 
    } 

    public bool HasErrors { get; set; } // Gets set via validation logic 

. LogginModel으로