WPF网格验证

时间:2012-06-13 15:02:58

标签: c# wpf

我有可编辑的网格,它绑定在GridRow的集合上(自定义类,为网格描述的行)。  GridRow具有属性Parameter (int),应由用户进行编辑。 如此简单的验证工作正常:我无法在此字段中插入类似“文本”或其他内容的内容。 但我需要在整个网格上进行验证。在列Parameter中,网格上只能有一个符号'1',两个'2',三个“3”,两个“5”。 所以例如,如果我已经插入网格值'1,2,3'并且我尝试插入'1',app应该显示验证消息。 我尝试用IDataErrorInfo来做这件事,但我无法进入整个表格。

2 个答案:

答案 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”活动解决了我的问题。