首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用INotifyDataErrorInfo

使用INotifyDataErrorInfo
EN

Stack Overflow用户
提问于 2013-11-07 18:44:30
回答 2查看 1.3K关注 0票数 0

在我的类中,我正在实现INotifyDataErrorInfo,当验证错误发生时,它工作得很好。它将红色的框架放在TextBox周围,但是当验证错误被修复时,它并没有摆脱它。

这是我的代码:

代码语言:javascript
复制
    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            string error = null;
            if (Context != null)
            {
                var messages = //GetMessages(); messages are validation errors
                if (messages.Count != 0)
                {
                    error = "This is critical error. Must be fixed";
                    AddError(columnName, "Some kind of error happend", false);
                }
                else
                {
                    RemoveError(columnName);
                }
            }
            return error;
        }
    }

    //I call this method to check for validation errors.
    public void CheckValidationErrors(string propertyName)
    {
        var error = this as IDataErrorInfo;
        string message = error[propertyName];

    }


    private Dictionary<String, List<String>> errors =
        new Dictionary<string, List<string>>();

    public void AddError(string propertyName, string error, bool isWarning)
    {
        if (!errors.ContainsKey(propertyName))
            errors[propertyName] = new List<string>();

        if (!errors[propertyName].Contains(error))
        {
            if (isWarning) errors[propertyName].Add(error);
            else errors[propertyName].Insert(0, error);
            RaiseErrorsChanged(propertyName);
        }
    }

    public void RemoveError(string propertyName, string error="")
    {
        if (error == "")
        {
            errors.Remove(propertyName);
            RaiseErrorsChanged(propertyName);
        }
        else
        {
            if (errors.ContainsKey(propertyName) &&
                errors[propertyName].Contains(error))
            {
                errors[propertyName].Remove(error);
                if (errors[propertyName].Count == 0) errors.Remove(propertyName);
                RaiseErrorsChanged(propertyName);
            }
        }
    }

    public void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }


    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (String.IsNullOrEmpty(propertyName) ||
            !errors.ContainsKey(propertyName)) return null;
        return errors[propertyName];
    }

    public bool HasErrors
    {
        get { return errors.Count > 0; }
    }

我调用RemoveError()方法来删除错误。我做错了什么吗?当验证修复时,我需要转到TextBox,选项卡将处理它。当验证错误消失时,我想立即删除那个红色帧。

更新:

当我在文本框中键入某些内容时,我需要异步地将该信息发送到服务器,如果存在任何验证问题,响应将给我带来一条消息。因此,我无法对更改的属性进行验证。如果有任何消息添加或删除,我将检查响应。如果有任何删除,我将调用CheckValidationErrors()。

答案

我正在实现IDataErrorInfo,然后决定实现INotifyDataErrorInfo。我在考虑如何使这个验证工作,我需要实现这两个接口。基本上,我从类中删除了IDataErrorInfo实现,并解决了这个问题。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-19 11:58:04

我正在实现IDataErrorInfo,然后决定实现INotifyDataErrorInfo。我在考虑如何使这个验证工作,我需要实现这两个接口。基本上,我从类中删除了IDataErrorInfo实现,并解决了这个问题。

票数 1
EN

Stack Overflow用户

发布于 2013-11-07 18:55:49

UpdateSourceTrigger用于TextBox的默认值是LostFocus

如果您想在错误修复后立即运行您的验证逻辑,您应该将其更改为PropertyChanged

代码语言:javascript
复制
<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19844103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档