[英]Silverlight DataGrid column validation
我的應用程序中有一個數據網格,並且我需要數據網格的某些列的值之和等於100。
如:
一個20
b 20
約60
這是對的
一個20
b 20
62 62
這個不對
有什么想法可以通過MVVM廣告INotifyDataErrorInfo來實現嗎?
我現在的問題是,如果我僅將屬性綁定到單元格,然后拋出ErrorChanged,則datagrid會將我鎖定在更改了數據的行上,因此除非恢復原始值以使之和,否則我將無法移動到任何地方。該列將再次變為100。
請不要在CellEdit上發布帶有手動驗證的各種代碼隱藏解決方案或類似的內容-我自己可以編寫這種骯臟的代碼。 我正在嘗試尋找適合綁定和MVVM的干凈解決方案
就我所見,盡管 Silverlight Datagrid完全損壞,未完成且沒有人在乎。 也許有人知道那里有合適的數據網格(或者他們實際上是在Silverlight 5中修復的?)
現在使用以下:
在我的ViewModel構造函數中
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創建的ICollectionView,它是ObservableCollection)。 然后OnChanges到任何對象
validator.ValidateAll();
這將導致評估在構造函數中創建的驗證規則。 此后,我在整個對象集合的視圖模型的errorCOllection中都出現了Error,但是它沒有顯示任何紅色邊框。 在列表中,我可以看到有一個錯誤並禁用了保存按鈕:)
我已經在datagrid上實現了討厭的驗證,除非您必須執行異步驗證,否則從綁定對象中可以很好地完成它。 我不確定要綁定到列表的對象,但是我會使用類似以下的內容:
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);
}
添加錯誤方法將觸發驗證摘要顯示在數據網格上。 希望這就是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.