Laden...

Probleme mit Button (de)aktivieren bei Default-UpdateSourceTrigger=LostFocus

Erstellt von sth_Weird vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.153 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 9 Jahren
Probleme mit Button (de)aktivieren bei Default-UpdateSourceTrigger=LostFocus

Hallo,
ich stehe vor folgendem Problem und weiß nicht so recht, wie ich es am geschicktesten lösen kann (denke aber, dass doch schon mehrere Leute darüber gestolpert sein sollten???)

Ich habe ein View mit TextBoxen und einem Speichern-Button und dahinter ein ViewModel mit IDataErrorInfo etc. implementiert. Der Speichern-Button ist nur enabled wenn das ViewModel keine Fehler mehr hat. Nun ist es aber so, dass die Textbox ja durch den Default-UpdateSourceTrigger den Wert erst ins ViewModel übernimmt, wenn sie den Fokus verliert. D.h. aber, wenn ich den Wert einer fehlerhaften TextBox korrigiere, kann ich nicht direkt auf Speichern klicken, weil der Fokus ja noch auf der TextBox ist und das ViewModel folglich nichts von der Korrektur weiß, sich noch im Fehler-Zustand befindet und den Speichern-Button noch sperrt. Erst wenn ich den Fokus von der TextBox runternehme wird der Speichern-Button enabled da dann auch der Wert im ViewModel aktualisiert ist. Dieser gezwungene Fokuswechsel ist aber überhaupt nicht benutzerfreundlich 😦 Ich denke, ich kann doch nicht die einzige sein, die über dieses Problem gestolpert ist???) Außerdem gibt es ja den negativen Fall auch: Das ViewModel ist noch richtig aber im View wurde was falsches eingegben: der Speicher-Button kann direkt geklickt werden 😦 Natürlich prüft man in der Speichern-Funktion nochmal ob wirklich kein Fehler da ist 😉

Alternativen wären, den Wert durch Ändern des UpdateSourceTriggers immer direkt ins ViewModel zu übernehmen, dann würde aber quasi bei jedem eingegebenen Zeichen die Fehlerprüfung losgehen (die schon mal so lange gehen kann, dass der Anwender eine klitzekleine Verzögerung bemerkt, welche bei Fokuswechsel nicht weiter relevant ist, wenn sie bei jedem eingegebenen Zeichen auftritt aber doch stört).
OOODER
Ich lasse den Speicher-Button einfach immer enabled und prüfe halt beim Klicken ob Fehler vorhanden sind und breche ggf. das Speichern ab (Die Fehlermeldungen stehen ja sowieso auch auf dem Formular).
Das ginge schon auch, aber schöner ist es natürlich, wenn man den Button erst garnicht anklicken könnte.

Gibt es noch weitere Alternativen?

Gruß & danke
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

5.299 Beiträge seit 2008
vor 9 Jahren

Also schön wäre offensichtlich, wenn die Validität bereits geprüft ist, noch während die TB den Focus hat. Also DataSourceUpdateMode.OnPropertyChanged.
Da diese Prüfung zeitintensiv ist, wäre es vlt. eine Möglichkeit, sie asynchron durchzuführen?

Der frühe Apfel fängt den Wurm.

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 9 Jahren

Danke für deine Antwort. Möglich wäre das wahrscheinlich schon, aber es macht mir den Code für meinen Geschmack zu kompliziert (und die asynchrone Prüfung muss ja auch fertig sein, bevor ein schneller Klicker den Speichern Button angeklickt hat).
Ich löse es jetzt so, dass der Speicher Button immer enabled ist, aber er speichert halt nur wenn keine Fehler vorhanden sind.

trotzdem danke!
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

Du könntest auch bei Änderung des Textes in einer Textbox einen Timer anstoßen, der die Validierung nach einem bestimmten Intervall (z.B. 1/2 Sek.) vornimmt.
Wenn der Benutzer schneller tippt, startest Du bei jeder neuen Eingabe den Timer neu. Dann wird validiert, kurz nachdem der User aufhört zu tippen. Beim Verlassen der Textbox sollte natürlich weiterhin direkt validiert werden.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

T
314 Beiträge seit 2013
vor 9 Jahren
Hinweis von Coffeebean vor 9 Jahren

Bitte benutze richtige Code-Tags [Hinweis] Wie poste ich richtig? Punkt 6

Falls Du .NET 4.5 einsetzt, kannst Du auch ein Delay im Binding angeben.

Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Delay=200}"

Für 4.0 könntest Du noch versuchenDelay property on Binding from .Net 4.5 in .Net 4.0

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 9 Jahren

Danke für die weiteren Tipps, solange sich aber keiner daran stört, dass der Speichern-Button immer enabled ist, werde ich es dabei lassen (ist die einfachste Lösung).

grüße
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+