[英]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.