Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么IDataErrorInfo在应用程序启动时显示错误_C#_Wpf_Mvvm_Idataerrorinfo - Fatal编程技术网

C# 为什么IDataErrorInfo在应用程序启动时显示错误

C# 为什么IDataErrorInfo在应用程序启动时显示错误,c#,wpf,mvvm,idataerrorinfo,C#,Wpf,Mvvm,Idataerrorinfo,我正在ViewModel中实现IDataErrorInfo 我有两个属性'Nom'和'Prenom',我想强制执行 #region IDataErrorInfo string IDataErrorInfo.Error { get { return null; } } string IDataErrorInfo.this[string propertyName] { get { return GetValidati

我正在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}" />

这不是正常的行为,因为空字段验证失败了吗?您可能需要使用
UpdateSourceTrigger=Explicit
使其按您希望的方式工作

我不得不使用一个答案,因为我在评论中没有空间了

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

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


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

这不是正常的行为,因为空字段验证失败了吗?您可能需要使用
UpdateSourceTrigger=Explicit
使其按您希望的方式工作。我将其更改为Explicit,但结果总是一样的same@Sheridan让我抓狂的是,我没有在应用程序启动时进行IsValid测试:(@Schneider:data binding engine第一次绑定属性时,会对属性进行验证。为什么不应该这样做?因为正如您在验证方法中定义的那样,
null
无效,并且您已经设置了
NotifyOnValidationError=True
,那么您期望得到什么呢?我总是在正确的ty(例如,
ValidateNom
),但将在您的案例中的主验证中检查其是否为null或空
是否有效
if (!IsValid)
    return;