1

我正在使用 IDataErrorInfo 继承的业务对象进行验证。

public string UserId { get; set; }

public string this[string columnName]
    {
        get
        {
            string result = null;

            if (columnName == "UserId")
            {
                if (string.IsNullOrEmpty(UserId))
                    result = "Please enter User Id";
            }
        }
    }

当我单击菜单上的按钮时,我想清除所有验证错误 - 例如 - LogOut。

窗口使登录面板可见,但前一个面板的验证错误标记仍出现在当前登录面板中。

我尝试了所有选项来分配 NULL 数据上下文、新实体对象……但没有运气

我感谢您的帮助。

4

1 回答 1

2

使用IDataErrorInfo接口是一种错误优先类型的方法。这意味着您将看到错误,直到它们被清除。您可以看到索引器上没有设置器。

原始IDataErrorInfo界面本身并不太有用,因为它一次只处理一个错误。我在BaseDataType课堂上添加了以下字段:

protected ObservableCollection<string> errors = new ObservableCollection<string>();

在我的实际数据类中,我具有以下属性:

public override ObservableCollection<string> Errors
{
    get
    {
        errors = new ObservableCollection<string>();
        errors.AddUniqueIfNotEmpty(this["Property1"]);
        errors.AddUniqueIfNotEmpty(this["Property2"]);
        errors.AddUniqueIfNotEmpty(this["PropertyN"]);
        return errors;
    }
}

AddUniqueIfNotEmpty方法是一种扩展方法,我认为它是不言自明的。此属性会多次调用索引器,并将所有结果编译到一个ObservableCollection<string>集合中,以便在 UI 中显示。您需要INotifyPropertyChanged.PropertyChanged使用名为Errorswhen的事件来调用该事件Property1Property2PropertyN对其进行更新以使其正常工作。

你可以做这样的事情,但是当你想清除错误时,添加一个 setter 让你传入一个空的集合或字符串。

于 2013-07-30T15:54:54.010 回答