質問

私のクラスで私は実装しています INotifyDataErrorInfo そして、検証エラーが発生した場合、それは正常に動作しています。それはテキストボックスの周りにその赤いフレームを置いていますが、検証エラーが修正されたときにそれを取り除くことはありません。

これが私のコードです:

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            string error = null;
            if (Context != null)
            {
                var messages = //GetMessages(); messages are validation errors
                if (messages.Count != 0)
                {
                    error = "This is critical error. Must be fixed";
                    AddError(columnName, "Some kind of error happend", false);
                }
                else
                {
                    RemoveError(columnName);
                }
            }
            return error;
        }
    }

    //I call this method to check for validation errors.
    public void CheckValidationErrors(string propertyName)
    {
        var error = this as IDataErrorInfo;
        string message = error[propertyName];

    }


    private Dictionary<String, List<String>> errors =
        new Dictionary<string, List<string>>();

    public void AddError(string propertyName, string error, bool isWarning)
    {
        if (!errors.ContainsKey(propertyName))
            errors[propertyName] = new List<string>();

        if (!errors[propertyName].Contains(error))
        {
            if (isWarning) errors[propertyName].Add(error);
            else errors[propertyName].Insert(0, error);
            RaiseErrorsChanged(propertyName);
        }
    }

    public void RemoveError(string propertyName, string error="")
    {
        if (error == "")
        {
            errors.Remove(propertyName);
            RaiseErrorsChanged(propertyName);
        }
        else
        {
            if (errors.ContainsKey(propertyName) &&
                errors[propertyName].Contains(error))
            {
                errors[propertyName].Remove(error);
                if (errors[propertyName].Count == 0) errors.Remove(propertyName);
                RaiseErrorsChanged(propertyName);
            }
        }
    }

    public void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }


    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (String.IsNullOrEmpty(propertyName) ||
            !errors.ContainsKey(propertyName)) return null;
        return errors[propertyName];
    }

    public bool HasErrors
    {
        get { return errors.Count > 0; }
    }

エラーを削除するためにremoverError()メソッドを呼び出しています。私は何か間違ったことをしていますか?検証が修正されたら、テキストボックスに移動する必要があり、そのタブはそれを処理します。検証エラーがなくなったら、すぐにその赤いフレームを削除したいと思います。

アップデート:

テキストボックスに何かを入力すると、その情報を非同期にサーバーに送信する必要があり、検証の問題がある場合はメッセージが表示されます。そのため、プロパティの検証が変更されていません。メッセージが追加または削除された場合、応答を確認します。削除された場合は、checkvalidationerrors()を呼び出します。

答え

私は実装していました IDataErrorInfo そして、実装することにしました INotifyDataErrorInfo. 。私はこの検証作業を行うことを考えていました。両方のインターフェイスを実装する必要があります。だから基本的に私は削除しました IDataErrorInfo 私のクラスからの実装とそれが問題を修正しました。

助けてくれてありがとう!

役に立ちましたか?

解決 2

私は実装していました IDataErrorInfo そして、実装することにしました INotifyDataErrorInfo. 。私はこの検証作業を行うことを考えていました。両方のインターフェイスを実装する必要があります。だから基本的に私は削除しました IDataErrorInfo 私のクラスからの実装とそれが問題を修正しました。

他のヒント

のデフォルト値 UpdateSourceTrigger 為に TextBoxLostFocus.

に変更する必要があります PropertyChanged エラーが修正されたら、すぐに検証ロジックを実行する場合。

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top