为什么 IDataErrorInfo 在应用启动时显示错误

本文关键字:显示 错误 启动 应用 IDataErrorInfo 为什么 | 更新日期: 2023-09-27 18:34:05

我正在我的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="{Binding Nom,
                        ValidatesOnDataErrors=True,
                        UpdateSourceTrigger=LostFocus,
                        NotifyOnValidationError=True}" />

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

我正在这样做(在单击事件中(,因此它应该在单击之后而不是之前显示错误:

if (!IsValid)
    return;

为什么 IDataErrorInfo 在应用启动时显示错误

这不是

正常行为,因为空字段验证失败吗?您可能需要使用 UpdateSourceTrigger=Explicit 来使此操作按您希望的方式工作。

我不得不使用答案,因为我在评论中的空间不足

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

框架并不总是知道何时检查这些东西,但它们将始终在启动时检查......想想看 - 在大多数情况下,这正是我们想要的。只是很不幸,这次你不想这样。

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