DataBinding zwischen CheckBox und Property in eigener Klasse: Property wird bei LostFocus gesetzt

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    DataBinding zwischen CheckBox und Property in eigener Klasse: Property wird bei LostFocus gesetzt

    Ich habe hier ein Problem mit Binding.
    Per DataBinding ist eine CheckBox (Checked-Property) an die IsOpen-Property der Singleton-Instanz der Klasse ConnectionManager gebunden.
    Ich habe einen Haltepunkt im Set-Teil der Property gesetzt. Der Set-Teil wird aber unter ganz komischen Bedingungen aufgerufen. Das hängt vom Binding ab.

    Ohne Binding wird der Set-Teil nicht aufgerufen. Das ist logisch und auch OK.

    CheckBox_Connection_Open.DataBindings.Add(New Binding("Checked", ConnectionManager.Instance, "IsOpen"))
    Bei diesem Binding wird der Set-Tei nicht aufgerufen, wenn ich auf der CheckBox herumklicke. Erst, wenn die CheckBox den Fokus verliert (ich z.B. auf die ListBox daneben klicke), dann wird der Set-Teil aufgerufen.

    Ich bin dann einfachmal alle DataSourceUpdateModes durchgegangen:
    CheckBox_Connection_Open.DataBindings.Add(New Binding("Checked", ConnectionManager.Instance, "IsOpen", False, DataSourceUpdateMode.Never))
    Hier wird, wie erwartet, der Set-Teil nie aufgerufen (wofür ist dieser Modus eigentlich gut?).

    CheckBox_Connection_Open.DataBindings.Add(New Binding("Checked", ConnectionManager.Instance, "IsOpen", False, DataSourceUpdateMode.OnValidation))
    Genau das gleiche Verhalten wie ohne eine Angabe von DataSoureUpdateMode.

    CheckBox_Connection_Open.DataBindings.Add(New Binding("Checked", ConnectionManager.Instance, "IsOpen", False, DataSourceUpdateMode.OnPropertyChanged))
    Hier wird (so soll es sein) der Set-Teil sofort aufgerufen, sobald die CheckBox ge(un)checkt wird. Aber: Er wird auch aufgerufen, wenn die CheckBox den Fokus verliert. Was aber eigentlich nicht sein sollte.


    Hab ich da was übersehen? Handhabe ich das Binding falsch?
    Es wäre hier für die meisten Dinge nicht unbedingt notwendig, Binding zu verwenden, aber mir geht's hier ums Prinzip. Vielleicht finde ich hier auch noch andere Probleme, die sich eingeschlichen haben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Niko Ortner“ ()

    Wie ist es mit CheckBox_Connection_Open.DataBindings.Add(New Binding("CheckState", ConnectionManager.Instance, "IsOpen", True, DataSourceUpdateMode.OnPropertyChanged))?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade: Der Boolean-Parameter hier heißt "formattingEnabled" und sollte deshalb eigentlich nichts damit zu tun haben. Aber mal zum testen....
    Nö, funktioniert nicht. Wird immer noch aufgerufen, wenn die CheckBox den Fokus verliert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    jo, das sind die 2 Optionen, wann ein gebundenes Control seine Datenquelle updatet: Entweder OnValidation oder OnPropertyChanged.

    OnValidation ist für die meisten Fälle sinnvoll, etwa wenn du in einer Textbox rumtippst, oder in einem DateTimepicker rumklickst, oder NumericUpdown odre was. Da "wartet" gewissermaßen das Binding bis du fertig bist mit edeiner Eingabe, und übernimmt die Daten erst, wenn du den Focus wegnimmst.
    Genau betrachtet wird bei FocusVerlust das Validation-Event gefeuert, indem übrigens auch die Gültigkeit einer Eingabe geprüft werden kann, und falls ungültig noch gecancelt.

    OnPropertyChanged wird halt viel häufiger gefeuert, und kann auch ganz schön nerven. Den Setter einer Property sollte man übrigens fast immer dagegen absichern, dass Code ausgelöst wird, wenn derselbe Wert, der schon drin ist, nochmal zugewiesen wird. Hier mein Snippet für die Struktur jedweder Property:

    VB.NET-Quellcode

    1. Private _PropertyName As PropType = Nothing
    2. Public Property PropertyName() As PropType
    3. Get
    4. Return _PropertyName
    5. End Get
    6. Set(value As PropType)
    7. If _PropertyName Is value Then Return
    8. _PropertyName = value
    9. End Set
    10. End Property
    @ErfinderDesRades: Das erklärt leider noch nicht, warum das Binding auch angewandt wird, wenn die CheckBox den Fokus verliert. Denn in diesem Fall soll tatsächlich gebunden werden, sobald sich die Checked-Property ändert (nicht erst, sobald die CheckBox den Fokus verliert).
    Ich teste mal, ob es am Binding oder an der CheckBox liegt...
    Edit: Ich habe keine Chance herauszufinden, welches Event vom Binding verwendet wird. Das kann ich also nicht testen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()