2012-06-06 46 views
1

我在我的申請數據網格和我需要數據網格的某些列具有相同的值的總和爲100。Silverlight的DataGrid列驗證

如:

B 20

C 60的

這個人是右

B 20

Ç62

這個人是不是正確的

有我如何與MVVM廣告INotifyDataErrorInfo實現這個任何想法?

我現在的問題是,如果我只是綁定屬性到單元格,然後拋出ErrorChanged,datagrid會鎖定我我已經改變了數據的行,所以我將無法移動任何地方,除非我恢復原來的價值以便列中的總和再次變爲100。

不要在CellEdit或類似的東西上發佈各種手動驗證的代碼隱藏解決方案 - 我可以自己編寫這樣的髒代碼。我試圖找到適合綁定和MVVM的乾淨的解決方案

據我看到,雖然 Silverlight的數據網格是完全破碎,未完成,沒人在乎。也許有人適當的DataGrid知道那裏(或者他們實際上在Silverlight 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是我的集合(順便說一句,我的壞,它實際上是從_payElements,這是ObservableCollection創建的ICollectionView)。然後OnChanges到任何對象

 validator.ValidateAll(); 

這會導致在構造函數中創建的驗證規則被評估。在這之後,我在整個對象集合的viewmodel的errorCollection中出錯,但它沒有顯示任何紅色邊框。以及在列表中,我可以看到,有一個錯誤,並禁用保存按鈕:)

+0

Silverlight的確有些像解決問題的辦法,只有微軟有/不存在 - 不願意使用Adobe Flash或HTML5! – Coops

+0

什麼是網格?我可以根據您的ViewModel的外觀以及顯示錯誤的位置來想出幾種不同的方法來實現此目的。 – cadrell0

+0

網格綁定到視圖模型中的ObservableCollection 。網格本身包含綁定到MyBusinessObject屬性的一堆TempleteColumns。我不介意在錯誤摘要中顯示錯誤,但我更喜歡它在其中驗證屬性的列(或者列中的每個控件) – noaRAVE

回答

0

我已經實施了對數據網格的討厭驗證,除非你必須執行異步驗證,它從綁定對象做得非常好。我不知道你要綁定到列表中的對象,但我會用類似如下:

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"); 
    } 
} 

然後使用http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

默認的實現是在實施例部分。

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); 
} 

add error方法將觸發驗證摘要顯示在datagrid上。希望這是你正在尋找的。

+0

此代碼檢查行中的總和,而我需要檢查列中的總和(所以這將是幾個對象/行的相同屬性/列的總和)。所以在你的情況下,如果你輸入無效的數據,整行將是可編輯的,你將能夠改變其他列的值,再次適當的總和。如果你試圖用這種方式來做這件事,那麼你將無法編輯其他行中的任何內容,並且將被迫僅僅將編輯行中的值恢復到之前的值。 – noaRAVE