我有可编辑的网格,它绑定在GridRow
的集合上(自定义类,为网格描述的行)。
GridRow
具有属性Parameter
(int)
,应由用户进行编辑。
如此简单的验证工作正常:我无法在此字段中插入类似“文本”或其他内容的内容。
但我需要在整个网格上进行验证。在列Parameter
中,网格上只能有一个符号'1',两个'2',三个“3”,两个“5”。
所以例如,如果我已经插入网格值'1,2,3'并且我尝试插入'1',app应该显示验证消息。
我尝试用IDataErrorInfo
来做这件事,但我无法进入整个表格。
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
我通过订阅“CellVaildate”活动解决了我的问题。