首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >inotifydataerrorinfo获取所有验证错误

inotifydataerrorinfo获取所有验证错误
EN

Stack Overflow用户
提问于 2015-11-21 01:02:49
回答 1查看 723关注 0票数 1

目前,我正在用INotifyDataErrorInfo处理的验证系统开发.net 4.5WPFMVVM应用程序。在应用程序的某个点上,我必须检查是否有任何验证错误,目前是这样完成的:

代码语言:javascript
运行
复制
public class RootViewModel : BindableBase
{
     //class code

            if (designInformation.Technology == Technology.CVT)
            {
                if (designInformation.HasErrors) return;
                if (InfoInputViewModel.TrafoProperties.HasErrors) return;
                if (InfoInputViewModel.CapacitorVoltageTransformerViewModel.CapacitorVoltageDivider.HasErrors) return;
                if (InfoInputViewModel.CapacitorVoltageTransformerViewModel.IntermediateVoltageTransformer.HasErrors) return;
                if (SpecialDesignViewModel.SpecialDesignInformation.HasErrors) return;
                foreach (var item in InfoInputViewModel.SecondaryWindings.WindingsCollection)
                {
                    if (item.HasErrors) return;
                }

                performCalculationsCVT();
            }
}

我正在寻找一种方法,通过一次从模型中获取所有错误来简化这段代码,但不知道从哪里开始解决这个问题。

下面是我使用的INotifyDataErrorInfo接口的实现。

代码语言:javascript
运行
复制
public class ValidableBase : BindableBase, INotifyDataErrorInfo
{
    protected readonly Dictionary<string, ICollection<string>>
    _validationErrors = new Dictionary<string, ICollection<string>>();

    #region INotifyDataErrorInfo Implementation

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

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

    public IEnumerable GetErrors(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName) || !_validationErrors.ContainsKey(propertyName))
            return null;

        return _validationErrors[propertyName];
    }

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

    public void AddError(string propertyName, string message)
    {
        if (_validationErrors.ContainsKey(propertyName))
        {
            string value = _validationErrors[propertyName].First();
            value += Environment.NewLine;
            value += message;
            _validationErrors[propertyName] = new List<string> { value };
        }
        else
            _validationErrors[propertyName] = new List<string> { message };

        RaiseErrorsChanged(propertyName);
    }

    public void RemoveError(string propertyName)
    {
        _validationErrors.Remove(propertyName);

        RaiseErrorsChanged(propertyName);
    }

    [XmlIgnore]
    public Dictionary<string, ICollection<string>> ValidationErrors 
    {
        get { return this._validationErrors; }
    }

    #endregion 
}

}

EN

回答 1

Stack Overflow用户

发布于 2015-11-21 02:09:51

显然,基类不知道特定子类具有什么属性,更不用说它们是否实现了INDEI。您必须编写逻辑才能做到这一点。有很多方法可以实现这一点。

对我来说,我会在基类中添加一个抽象方法

代码语言:javascript
运行
复制
abstract class ValidableBase 
{
    // snip
    protected abstract IEnumerable<ValidableBase> GetValidableProperties();
    // snip

然后将HasErrors更改为根据上述调用的结果递归调用HasErrors

代码语言:javascript
运行
复制
public bool HasErrors
{
    get { return _validationErrors.Count > 0 ||
          GetValidableProperties().Any(x => x.HasErrors); }
}

GetValidableProperties的一个示例实现可能是

代码语言:javascript
运行
复制
protected override IEnumerable<ValidableBase> GetValidableProperties()
{
    yield return SomeProperty; // a Validable property
    yield return SomeOtherProperty; // this too
    foreach(var prop in SomeCollectionProperty) // collection of Validable
        yield return prop;
}

最后,我将Validable重命名为Validatable,这是正确的(英语)拼写。如果我是西班牙人或法国人,我可能会跳过最后一步。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33832172

复制
相关文章

相似问题

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