2009-09-05 8 views
2

IDataErrorInfo 및 마스터 세부 정보보기를 구현하는 ViewModel이 있습니다. 사용자가 상세보기에서 저장 버튼을 눌렀을 때 이전 ViewModel 항목의 유효성 검사를 어떻게 트리거 할 수 있습니까?버튼 클릭시 ViewModel 확인

+0

에서 보기

<TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" /> 

에서


나뿐만 아니라 여기에 대한 답을 싶어요 – Charlie

답변

4

VM에 플래그를 포함하기 시작하면 기본적으로 false로 설정하십시오. 버튼 명령 코드 (버튼을 VM의 명령에 바인딩했다고 가정)에서 유효성 검사 코드를 실행하기 전에 플래그를 설정하십시오.

IDataErrorInfo 속성의 "get"코드에서 플래그가 true로 설정된 경우 유효성 검사 오류 만 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

플래그를 다시 false로 전환하기 전에 특성 문자열로 PropertyChangedEvent를 발생 시키십시오. 그러면 바인딩 시스템이 현재 컨텍스트의 모든 바인딩을 재평가하고 IDataErrorInfo에 대한 오류를 확인합니다.

3

benPearce가 훌륭한 답을 제공했습니다.

그는 지적했다.

  1. 는 클릭이 WPF 재 evaluete 바인딩을 수 있도록 OnPropertyChanged(null)를 호출 할 필요가 저장 명령 내에서
  2. "저장"(와 인덱서를 심문)까지 (데이터가 유효하지 않은 경우에도)
  3. this[columnName]는 null이

플래그를 사용하는 대신이 샘플은 사전을 사용하여 동일한 결과를 얻습니다. 의 ViewModel

public string Surname { get; set; } 

#region Validation 
//http://blogs.msdn.com/b/bethmassi/archive/2008/06/27/displaying-data-validation-messages-in-wpf.aspx 
Dictionary<string, string> validationErrors = new Dictionary<string,string>(); 

void Validate() 
{ 
    validationErrors.Clear(); 
    if (srtring.IsNullOrWhitespace(Surname)) // Validate Surname 
    { 
     validationErrors.Add("Surname", "Surname is mandatory."); 
    } 

    //http://stackoverflow.com/a/5210633/240835 
    // Call OnPropertyChanged(null) to refresh all bindings and have WPF check the this[string columnName] indexer. 
    OnPropertyChanged(null); 
} 

#region IDataErrorInfo Members 
public string Error 
{ 
    get 
    { 
     if (validationErrors.Count > 0) 
     { 
      return "Errors found."; 
     } 
     return null; 
    } 
} 

public string this[string columnName] 
{ 
    get 
    {     
     if (validationErrors.ContainsKey(columnName)) 
     { 
      return validationErrors[columnName]; 
     } 
     return null; 
    } 
} 

#endregion 
#endregion 
public void Save() 
{ 
    Validate(); 
    if (validationErrors.Count == 0) 
    { 
     DoSave(); 
    } 
} 
관련 문제