2

我正在我的 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;
4

1 回答 1

2

由于空字段未通过验证,这不是正常行为吗?您可能需要使用UpdateSourceTrigger=Explicit它来按照您希望的方式进行这项工作。

由于评论中空间不足,我不得不使用答案

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

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

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

于 2013-10-04T11:03:14.223 回答