2

ViewModel に IDataErrorInfo を実装しています。

必須にしたい 'Nom' と 'Prenom' の 2 つのプロパティがあります。

    #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インデクサーメソッドにブレークポイントを配置し(のCanExecuteハンドラーと同じですICommand)、アプリケーションに戻ろうとすると、ブレークポイントがすぐにヒットします...そしてこれは毎回発生しますアプリケーションに戻ろうとしたとき。

フレームワークは、これらのことをいつチェックするかを常に認識しているわけではありませんが、起動時に常にチェックされます...考えてみてください-ほとんどの状況では、それがまさに私たちが望んでいることです。今回はそれを望んでいないのは残念です。

個人的には、とにかくこの方法が好きです...これは予測検証などと呼ばれ、ユーザーがデータを入力するに何を入力する必要があるかを知ることができます. 確かに、これは、フィールドに値を入力して保存ボタンをクリックするという古いシステムよりもはるかに優れています。したがって、そのエラーを修正して再度保存しようとすると、別のエラーが通知されます。

于 2013-10-04T11:03:14.223 に答える