2012-06-13 6 views
1

모음에 GridRow (사용자 정의 클래스, 그리드의 행 설명)을 바인딩하는 편집 가능한 표가 있습니다. GridRow의 속성은 Parameter(int)이며 사용자가 편집해야합니다. 그래서 간단한 유효성 검사가 잘 작동합니다 :이 필드에 "text"또는 다른 것과 같은 것을 삽입 할 수 없습니다. 하지만 전체 격자에 대한 유효성 검사가 필요합니다. 그리드의 Parameter 열에는 '1', 2'2 ', 3'3 ', 2'5 '중 하나의 기호 만 사용할 수 있습니다. 예를 들어, 이미 '1,2,3'모눈 값에 삽입하고 '1'을 삽입하려고하면 앱에서 유효성 검사 메시지를 표시해야합니다. 나는 IDataErrorInfo으로 이것을 시도하지만 세터 전체 테이블에 들어갈 수 없다.WPF 표 유효성 검사

답변

1

'CellVaildate'이벤트에 가입하면 문제가 해결되었습니다.

1

아마 내가 validating business rules in MVVM에 관한 블로그 기사에 관심이 있으십니까?

ViewModel에서 모델 유효성 검사 코드를 첨부 할 수 있으며 수행하려는 작업을 수행해야합니다.

public class GridViewModel 
{ 
    // Kept this generic to reduce code here, but it 
    // should be a full property with PropertyChange notification 
    public ObservableCollection<GridRowModel> GridRows{ get; set; } 

    public UsersViewModel() 
    { 
     GridRows = GetGridRows(); 

     // Add the validation delegate to the UserModels 
     foreach(var row in GridRows) 
      user.AddValidationErrorDelegate(ValidateGridRow); 
    } 

    // User Validation Delegate to verify UserName is unique 
    private string ValidateGridRow(object sender, string propertyName) 
    { 
     if (propertyName == "Parameter") 
     { 
      var row = (GridRow)sender; 
      var existingCount = GridRows.Count(p => 
       p.Parameter == row.Parameter && p != row); 

      switch(row.Parameter) 
      { 
       case 1: 
        if (existingCount >= 0) 
         return string.Format("{0}s are already taken", row.Parameter); 
       case 2: case 5: 
        if (existingCount >= 1) 
         return string.Format("{0}s are already taken", row.Parameter); 
       case 3: 
        if (existingCount >= 2) 
         return string.Format("{0}s are already taken", row.Parameter); 
      } 
     } 
     return null; 
    } 
}