Databindig zwischen PictureBox und Bool Property einer Klasse

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Databindig zwischen PictureBox und Bool Property einer Klasse

    Hallo,

    ich habe schon etliche Berichte durchsucht, wo beschrieben ist, wie DataBinding bei Pictoreboxen funktioniert. Leider beziehen sich die Beispiele immer darauf, wie man Bilder aus einer Datenbank ließt, oder schreibt.

    Ich habe aber folgendes Problem: Eine Instanz einer Klasse stellt den Zustand von IOs eines externen Gerätes dar. Die Eigenschaften (bool) ändern sich also ständig. Eine Datenbindung an eine Checkbox zu Visualisierung der Zustände klappt. Ich möchte allerding den Zustand mit einer Art Diode anzeige, d.h. wenn Wert = 1 dann Bild "LED_ON" wenn Wert = 0 dann Bild "LED.OFF". Die Bilder muss ich nicht laden, da Sie schon in meine Resourcen Datei eingebunden sind.

    Kann mir bitte jemand helfen?

    Besten Dank.
    Genau da ist ja mein Problem. Ich habe noch keinen Code für dieses Problem.

    Ich habe eine PictureBox, die in Abhängigkeit einer Boolvariablen eine grüne oder rote LED anzeigen soll. Databindig ist leider noch ein recht neues Thema für mich.

    -------

    So, habe es doch mal kurz versucht. Wenn die Checkbox betätigt ist, soll die grüne ansonsten die graue LED angezeigt werden. In meinem Prog ist es über If Anweisungen gelöst. Ich benötige aber die Lösung mit Datenbindung.

    Ich habe mal das ganze Projekt gezippt.

    Danke
    Dateien

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

    Sorry, hier ist die neue Version.

    Die Eigenschaft LaserEin aus der Klasse Beschrifter wird über die Checkbox getoggelt. Abhängig von LaserEin soll dann die LED auch geändert werden.
    Dateien

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

    Also ich hab deine Beschrifter-Klasse mal mit INotifyPropertyChanged ausgestattet, weil ohne das gibts kein Databinding

    VB.NET-Quellcode

    1. Public Class Beschrifter : Implements INotifyPropertyChanged
    2. #Region "INotifyPropertyChanged"
    3. Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    4. Protected Sub OnPropertyChanged(ByVal propName As String)
    5. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
    6. End Sub
    7. Protected Function SetProperty(Of T)(ByRef backingField As T, ByVal value As T, ByVal propName As String) As Boolean
    8. If Object.Equals(backingField, value) Then Return False
    9. backingField = value
    10. OnPropertyChanged(propName)
    11. Return True
    12. End Function
    13. #End Region 'INotifyPropertyChanged
    und 3 Properties habich schoma angeschlossen an diese Funktionalität (muss man eiglich mit alle Props machen)

    VB.NET-Quellcode

    1. Public Property TruMarkDiagPfad As String
    2. Get
    3. Return myTruMarkDiagPfad
    4. End Get
    5. Set(ByVal value As String)
    6. SetProperty(myTruMarkDiagPfad, value, "TruMarkDiagPfad")
    7. End Set
    8. End Property
    9. Public Property LaserEin As Boolean
    10. Get
    11. Return myLaserEin
    12. End Get
    13. Set(ByVal value As Boolean)
    14. SetProperty(myLaserEin, value, "LaserEin")
    15. End Set
    16. End Property
    17. Public Property LaserBereit As Boolean
    18. Get
    19. Return myLaserBereit
    20. End Get
    21. Set(ByVal value As Boolean)
    22. SetProperty(myLaserBereit, value, "LaserBereit")
    23. End Set
    24. End Property

    im Form binde ich die Picbox daran, aber mit einem sehr speziellen Binding, nämlich mit DataSourceUpdateMode.Never und einer anonymen Umwandlungs-Funktion von boolean nach Bitmap, die das Binding.Format-Event behandelt.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim laser As New Beschrifter
    3. Private _Images As Bitmap() = New Bitmap() {My.Resources.LED_off, My.Resources.LED_on}
    4. Public Sub New()
    5. InitializeComponent()
    6. Dim bnd = PictureBox1.DataBindings.Add("BackgroundImage", laser, "LaserEin", True, DataSourceUpdateMode.Never)
    7. AddHandler bnd.Format, Sub(s, e)
    8. e.value = _Images(-CInt(e.value))
    9. End Sub
    10. End Sub
    11. Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged
    12. laser.LaserEin = CheckBox1.Checked
    13. End Sub
    14. End Class
    Insgesamt empfehle ich, solche Übungen eher zu lassen, und stattdessen deine Datenklassen als Datarows in einem typisierten Dataset anzulegen.
    gugge DB-Programmierung ohne Datenbank und weiterführende Links
    Dateien

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

    Besten Dank.

    So hat es funktioniert. Ich kann aber nicht alles genau nachvollziehen. Was genau macht

    VB.NET-Quellcode

    1. AddHandler bnd1.Format, Sub(s, e)e.value = _Images(-CInt(e.value))
    2. End Sub

    Muss ich jetzt den Code wie folgt weiter führen:

    VB.NET-Quellcode

    1. Dim bnd1 As System.Windows.Forms.Binding = pbSteuerungEin.DataBindings.Add("BackgroundImage", Laser, "SteuerungEin", True, DataSourceUpdateMode.Never)
    2. Dim bnd2 As System.Windows.Forms.Binding = pbLaserEin.DataBindings.Add("BackgroundImage", Laser, "LaserEin", True, DataSourceUpdateMode.Never)
    3. AddHandler bnd1.Format, Sub(s, e)e.value = _Images(-CInt(e.value))
    4. End Sub
    5. AddHandler bnd2.Format, Sub(s, e) e.value = _Images(-CInt(e.value))
    6. End Sub

    d.h. ich muss für jede LED einen Handler installieren?
    jo. Weil die Image-Property kannste nur an eine Image-Property binden, aber das hat deine Beschriftugns-Klasse ja nicht, und deshalb braucht man diese Konversion.
    Immerhin kann man die Konversion mehrmals verwenden

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. dim conversion as ConvertEventHandler = Sub(s, e) e.value = _Images(-CInt(e.value))
    4. Dim bnd = PictureBox1.DataBindings.Add("BackgroundImage", laser, "LaserEin", True, DataSourceUpdateMode.Never)
    5. AddHandler bnd.Format, conversion
    6. bnd = PictureBox2.DataBindings.Add("BackgroundImage", laser, "SteuerungEin", True, DataSourceUpdateMode.Never)
    7. AddHandler bnd.Format, conversion
    8. 'etc...
    9. End Sub