Frage

In meiner Klasse implementiere ich INotifyDataErrorInfo Und es funktioniert gut, wenn der Validierungsfehler auftritt. Es legt diesen roten Rahmen um das Textfeld um, wird jedoch nicht los, wenn der Validierungsfehler behoben wird.

Hier ist mein Code:

    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; }
    }

Ich rufe die Methode von REMELEERROR () auf, um Fehler zu entfernen. Mache ich etwas falsch? Wenn die Validierung festgelegt ist, muss ich zum Textfeld gehen und das Tabbing von wird sich darum kümmern. Ich möchte diesen roten Rahmen sofort entfernen, wenn der Validierungsfehler verschwunden ist.

AKTUALISIEREN:

Wenn ich etwas in ein Textfeld eingreife, muss ich diese Informationen asynchron an den Server senden, und die Antwort bringt mir eine Nachricht, wenn Validierungsprobleme vorhanden sind. Ich kann also keine Validierungs Dinge auf dem Grundstück verändert. Ich werde nach einer Antwort suchen, wenn eine Nachricht hinzugefügt oder entfernt wird. Wenn es entfernt ist, rufe ich CheckValidationErrors () auf.

ANTWORTEN

Ich habe implementiert IDataErrorInfo und beschlossen dann zu implementieren INotifyDataErrorInfo. Ich dachte, dass ich diese Validierungsarbeit zum Arbeiten habe, um beide Schnittstellen implementieren. Also habe ich im Grunde genommen entfernt IDataErrorInfo Implementierung aus meiner Klasse und das behoben das Problem.

Danke für die Hilfe!

War es hilfreich?

Lösung 2

Ich habe implementiert IDataErrorInfo und beschlossen dann zu implementieren INotifyDataErrorInfo. Ich dachte, dass ich diese Validierungsarbeit zum Arbeiten habe, um beide Schnittstellen implementieren. Also habe ich im Grunde genommen entfernt IDataErrorInfo Implementierung aus meiner Klasse und das behoben das Problem.

Andere Tipps

Standardwert von UpdateSourceTrigger zum TextBox ist LostFocus.

Sie sollten es an ändern PropertyChanged Wenn Sie Ihre Validierungslogik sofort ausführen möchten, sobald der Fehler behoben ist.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top