2012-06-06 2 views
1

내 응용 프로그램의 데이터 그리드가 나는 같이 100실버 데이터 격자 열 검증

에 같은 값의 합을 가지고 데이터 그리드의 특정 열을 필요

20

B 20

C 60

이것 옳은

(210) 20

B (20)

C (62)

이 하나

내가 MVVM 광고 INotifyDataErrorInfo와이를 구현하는 방법에 어떤 아이디어가 있습니까 옳지 않아?

내 문제는 지금 방금 속성을 셀에 바인딩하고 ErrorChanged를 던지면 DataGrid가 데이터를 변경 한 행에 나를 잠 그어 원래 값으로 복원하지 않으면 아무 곳으로나 이동할 수 없다는 것입니다. 그래서 그 열의 합은 다시 100이 될 것입니다.

하십시오이 같은가 cellEdit 또는 아무것도에 수동 검증과 다양한 코드 숨김 솔루션을 게시하지 않습니다 - 나는 그런 더러운 코드 나 자신을 작성할 수 있습니다. 바인딩 및 MVVM에 맞는 깨끗한 솔루션을 찾으려고합니다.

제가 알기 론, Silverlight datagrid는 완전히 깨졌으며 미완성이며 아무도 신경 쓰지 않습니다. (? 아니면 그들은 실제로 실버 라이트 5에 고정). 현재 사용되는 다음의 경우

어쩌면 누군가가 거기에 적절한 데이터 그리드 알고 : 내 뷰 모델의 생성자에서

 validator = new Validator(this); 
     validator.AddValidationFor(() => PayElements).When(() => _payElements.Where(p1 => (!String.IsNullOrEmpty(p1.Distribution) && FormatChecker.IsDecimal(p1.Distribution, 3, 2))).Sum(p2 => Decimal.Parse(p2.Distribution)) != 100).Show("ERROR!"); 

PayElements입니다 내 컬렉션 (btw, 내 나쁜, 사실 ICollectionView ObservableCollection _payElements에서 만든)입니다. 그런 다음 생성자에서 만든 유효성 검사 규칙이 평가되도록 모든 개체

 validator.ValidateAll(); 

에 OnChanges. 이 후 나는 전체 개체 컬렉션에 대한 내 viewmodel의 errorCOllection에 오류가 있지만 빨간색 테두리가 표시되지 않습니다. 잘 목록에서 나는 거기에 오류가 있음을 볼 수 있으며 저장 버튼을 해제하십시오 :

+0

Silverlight는 Microsoft 만 존재하거나 존재하지 않는 문제에 대한 해결책을 제공합니다. Adobe Flash 나 HTML5를 사용하지 않아도됩니다! – Coops

+0

바운드 그리드 란 무엇입니까? ViewModel의 모양과 오류를 표시하려는 위치에 따라이 작업을 수행하는 몇 가지 다른 방법을 생각해 낼 수 있습니다. – cadrell0

+0

Grid가 viewmodel의 ObservableCollection 에 바인드됩니다. Grid 자체에는 MyBusinessObject의 속성에 바인드 된 TempleteColumns 묶음이 포함되어 있습니다. 난 오류가 요약에 표시되는 마음은 없지만, 나는 그것이 유효화 된 속성 (또는 열에있는 모든 컨트롤)을 higlight 열을 선호합니다 – noaRAVE

답변

0

내가 데이터 격자에 불쾌한 검증을 구현하고 비동기 유효성 검사를 수행해야하지 않는 한 그것은 꽤 잘 바인딩 된 개체에서 이루어집니다. 난 당신이 목록에 바인딩 된 개체에 대한 확실하지 않다 그러나 나는 다음과 같은 것을 사용하는 것이 : 그런 다음 http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

기본 구현을 사용

public string Col1Wrapper 
{ 
    get 
    { 
     return this.Col1; 
    } 
    set 
    { 
     ValidateRequired("Col1Wrapper", value, "Required"); 
     ValidateRegularExpression("Col1Wrapper", value, @"^[\d]+$", "Must be digit"); 
     ValidateTotal(value,Col2,Col3,total);//in your case 
     this.Col1 = value; 
     this.RaisePropertyChanged("Col1Wrapper"); 
    } 
} 

public string Col2Wrapper 
{ 
    get 
    { 
     return this.Col2; 
    } 
    set 
    { 
     ValidateRequired("Col2Wrapper", value, "Required"); 
     ValidateRegularExpression("Col2Wrapper", value, @"^[\d]+$", "Must be digit"); 
     ValidateTotal(Col1,value,Col3,total);//in your case 
     this.Col2 = value; 
     this.RaisePropertyChanged("Col2Wrapper"); 
    } 
} 

public string Col3Wrapper 
{ 
    get 
    { 
     return this.Col3; 
    } 
    set 
    { 
     ValidateRequired("Col3Wrapper", value, "Required"); 
     ValidateRegularExpression("Col3Wrapper", value, @"^[\d]+$", "Must be digit"); 
     ValidateTotal(Col1,Col2,value,total);//in your case 
     this.Col3 = value; 
     this.RaisePropertyChanged("Col3Wrapper"); 
    } 
} 

예제 섹션에 있습니다.

public bool ValidateRequired(string property, string value, string errorMessage) 
{ 
    bool isValid = true; 

    if (value == null || value == string.Empty) 
    { 
     AddError(property, errorMessage, false); 
     isValid = false; 
    } 
    else RemoveError(property, errorMessage); 
    RaiseErrorsChanged(property); 
    return isValid; 
} 

public bool ValidateRegularExpression(string property, string value, string expression, string errorMessage) 
{ 
    ... 
} 

public bool ValidateTotal(string property,int 1, int 2, int 3, int total, string errorMessage) 
{ 
    if((1+2+3) != total) 
     AddError(property, errorMessage, false); 
    else RemoveError(property, errorMessage); 
} 

오류 추가 방법은 유효성 검사 요약을 데이터 그리드에 표시합니다. 희망이 당신이 찾고있는 것입니다.

+0

이 코드는 행의 합계를 확인합니다. 동안 내가 열에 합계를 확인해야합니다 (그래서 그것은 동일한 속성/열 여러 개체/행에서 합계가 될 것입니다). 그래서 귀하의 경우, 잘못된 데이터를 입력하면 전체 행을 편집 할 수 있으며 다른 열의 값을 변경하여 합계를 다시 만들 수 있습니다. 이 방법이 필요한 경우 다른 행의 내용을 편집 할 수 없으며 편집 된 행의 값을 원래대로 되 돌리도록 강요 받게됩니다. – noaRAVE