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

时间:2013-10-04 10:43:04

标签: c# wpf mvvm idataerrorinfo

我正在我的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 attribut,如下所示:

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

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

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

if (!IsValid)
    return;

1 个答案:

答案 0 :(得分:2)

这是不正常的行为,因为空字段验证失败?您可能需要使用UpdateSourceTrigger=Explicit以您希望的方式完成此工作。

  

我必须使用答案,因为我在评论中用完了空间

这就是......如果你在IDataErrorInfo索引器方法中设置一个断点(它与CanExecute的{​​{1}}处理程序相同)然后尝试返回应用程序,断点将立即被击中......这将发生每次时间您尝试返回应用程序。

框架并不总是知道何时检查这些东西,但是它们将始终在启动时进行检查...想一想 - 对于大多数情况来说,这正是我们想要的。很遗憾你这次不想要这个。

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