Ich erhalte nicht das Verhalten, das ich für eine TextBox erwarten würde, die an eine Integer-Eigenschaft in einem Business-Objekt gebunden ist.
Ich habe Folgendes getan:
(1) Stellen Sie die DataSourceUpdateMode
für die TextBox zu: OnValidation
.
(2) In der Validating
Ereignis für die TextBox, setzen Sie e.Cancel = True
wenn Integer.TryParse fehlschlägt.
(3) Fügen Sie einen Handler für Binding.Parse
y Binding.BindingComplete
und setzen Sie Haltepunkte in den Handlern.
Starten Sie die Anwendung, geben Sie "asdasd" in die TextBox ein und verlassen Sie die Anwendung mit der Tabulatortaste. Trotz Einstellung e.Cancel = True
die Parse
y BindingComplete
Ereignisse werden beide ausgelöst. Der Dokumentation zufolge ist die Einstellung e.Cancel = True
sollte jede weitere Logik unterdrücken.
Ich habe MSDN durchsucht, um herauszufinden, warum das passiert, aber ich kann nichts finden. Weiß jemand, wo ich einige Details zu diesem Thema finden kann?
ETA : Ich habe auch ein Handle für das Ereignis Validated hinzugefügt. Hier ist die Reihenfolge der Ereignisse:
Schlechte Daten:
(1) Validierung. (I eingestellt e.Cancel = True
)
(2) Parsen
(3) BindingComplete
Gute Daten:
(1) Validierung
(2) Parsen
(3) BindingComplete
(4) Validiert
ETA2 : Weitere Informationen und eine Umgehungslösung.
Das Problem mit diesem Verhalten ist, wenn Sie einige Validierung, die nicht in der Eigenschaft Setter implementiert ist haben.
Nehmen wir zum Beispiel an, meine Integer-Eigenschaft muss eine ungerade Zahl sein. Ich überprüfe dies nicht im Property Setter, sondern erst im Validierungsereignis.
Wie Sie aus dem obigen Verhalten ersehen können, wird der Wert als legitime Ganzzahl in die Datenquelle geschrieben, auch wenn ich die Validierung abbreche.
Trotz der Tatsache, dass die Datenquelle aktualisiert wird, wird das Validated-Ereignis nicht ausgelöst, wenn Sie Cancel im Validating-Ereignis setzen, so dass Sie den Benutzer immer noch daran hindern können, weiterzugehen.
Work-Around::
Um die Aktualisierung der Datenquelle zu stoppen, müssen Sie in der Datei Binding.Parse
Ereignis und löst eine Ausnahme aus, die verhindert, dass Binding erfolgreich abgeschlossen wird.
0 Stimmen
Guter Fund. [Sieht aus wie ein Winforms-Fehler][1]. [1]: connect.microsoft.com/VisualStudio/feedback/
0 Stimmen
Danke, ich habe den Fehler hochgestuft und ein Workaround hinzugefügt.