【问题标题】:Why IDataErrorInfo is showing errors at app startup为什么 IDataErrorInfo 在应用程序启动时显示错误
【发布时间】:2013-10-04 10:43:04
【问题描述】:

我正在我的 ViewModel 中实现 IDataErrorInfo。

我有两个属性 'Nom' 和 'Prenom',我想强制

    #region IDataErrorInfo

    string IDataErrorInfo.Error
    {
        get { return null; }
    }

    string IDataErrorInfo.this[string propertyName]
    {
        get { return GetValidationError(propertyName); }
    }

    #endregion IDataErrorInfo

    #region Validation

    private static readonly string[] ValidatedProperties = { "Nom", "Prenom" };

    public bool IsValid
    {
        get
        {
            foreach (string property in ValidatedProperties)
                if (GetValidationError(property) != null)
                    return false;

            return true;
        }
    }

    private string GetValidationError(string propertyName)
    {
        string error = null;

        switch (propertyName)
        {
            case "Nom":
                error = ValidateNom();
                break;

            case "Prenom":
                error = ValidatePrenom();
                break;
        }

        return error;
    }

    private string ValidateNom()
    {
        if (string.IsNullOrWhiteSpace(Nom))
        {
            return "Last name is mandatory";
        }

        return null;
    }

    private string ValidatePrenom()
    {
        if (string.IsNullOrWhiteSpace(Prenom))
        {
            return "First name is mandatory";
        }

        return null;
    }

我正在像这样绑定我的 TextBox 的 Text 属性:

<TextBox Text="{Binding Nom,
                        ValidatesOnDataErrors=True,
                        UpdateSourceTrigger=LostFocus,
                        NotifyOnValidationError=True}" />

我的问题是:文本框在失去焦点之前显示错误(在应用启动时)。

我正在这样做(在点击事件中),所以它应该在点击之后而不是之前显示错误:

if (!IsValid)
    return;

【问题讨论】:

  • 这不是正常行为,因为空字段未通过验证吗?您可能需要使用 UpdateSourceTrigger=Explicit 以按照您希望的方式进行这项工作。
  • 我改成Explicit,结果还是一样
  • @Sheridan 让我抓狂的是,我没有在应用启动时进行 IsValid 测试 :(
  • @Schneider:当数据绑定引擎第一次绑定属性时,它会验证它们。为什么不应该这样做?
  • 因为你在验证方法中定义的null是无效的,而且你已经设置了NotifyOnValidationError=True,那么你期望什么呢?我总是在属性的验证函数中忽略null(例如ValidateNom),但会在你的情况IsValid的主要验证中检查它是否为空或空;

标签: c# wpf mvvm idataerrorinfo


【解决方案1】:

这不是因为空字段未通过验证而导致的正常行为吗?您可能需要使用 UpdateSourceTrigger=Explicit 才能按照您希望的方式进行这项工作。

由于 cmets 空间不足,我不得不使用答案

事情是这样的...如果你在你的IDataErrorInfo索引器方法中放置一个断点(它与ICommandCanExecute处理程序相同)然后尝试返回到应用程序,断点会立即受到打击...每次您尝试返回应用程序时都会发生这种情况。

框架并不总是知道什么时候检查这些东西,但它们总是会在启动时检查...想想看 - 对于大多数情况,这正是我们想要的。不幸的是,这次你不想这样。

就我个人而言,无论如何我更喜欢这种方式...它被称为预测验证或类似的东西,它允许用户在尝试输入数据之前知道他们必须填写什么。当然,这比在字段中输入值、单击保存按钮、只是被告知您在某处出现错误的旧系统要好得多。因此,您修复了该错误并尝试再次保存,然后被告知另一个错误,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多