Probleme mit Binding in einem Style

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    Probleme mit Binding in einem Style

    Hallo zusammen.

    In meinem Projekt befindet sich folgender Style:

    XML-Quellcode

    1. <Style TargetType="CheckBox" x:Key="Checkbox_zentriert">
    2. <Setter Property="VerticalAlignment" Value="Center"/>
    3. <Setter Property="HorizontalAlignment" Value="Center"/>
    4. <Setter Property="IsEnabled" Value="{Binding schreibgeschützt, Converter={StaticResource Bool_Sichtbarkeit_Key}}"/>
    5. </Style>


    Der wird wie folgt eingebunden:

    XML-Quellcode

    1. <DataGridCheckBoxColumn Header="B" Binding="{Binding Gesehen_Beide, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource Checkbox_zentriert}"/>


    Die Bindung von "IsEnabled" funktioniert aber nicht. Das Property "schreibgeschuetzt" funktioniert und feuert auch Zustandsänderungen. Es ist an anderer Stelle auf die Sichtbarkeit eines Images gebunden. Der Converter ist auch korrekt eingebunden und auch komplett ohne ihn funktioniert die Bindung nicht. Mir scheint hier ist gar kein Binding möglich. Achja, die Einbindung des Style als DynamicResource funtioniert gar nicht.
    Auf "readonly" der gesamten Zelle oder des DataGrids reagiert die Checkbox nicht mehr, seit der Style verwendet wird. Eine DataGridTemplateColumn lässt sich nicht nach Anwahl der Zelle mit der Leertaste aktivieren / deaktivieren und daher keine Option für mich. (Außer jemand kennt eine Lösung für dieses Problem)

    Hier mal die Anforderungen an die Checkbox allgemein:
    1. mit EINEM Mausklick aktivieren / deaktivieren
    2. über Leertaste aktivieren / deaktivieren (das fehlt leider bei DataGridTemplateColumn)
    3. sitzt hori + verti mittig in der Zelle
    4. ist deaktiviert bzw. schreibgeschützt, wenn der gebundene Wert es vorgibt

    Gruß

    eddi
    Hallo Eichseinet

    Ist das "problem" noch aktuell. Dann schau ich dir da morgen gerne mal drüber.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,
    ja das ist noch aktuell. Ich hatte mich inzwischen damit abgefunden die Checkbox nicht deaktivieren zu können. Dabei geht es eigentlich nur darum mir unnötige Arbeit zu ersparen, falls ich mal nicht aufpasse. Speichern lässt sich die Datei mit Schreibschutz nicht, aber die Checkboxen können halt verändert werden.
    P.S. verwendet man statt einer Bindung den festen Wert "False", dann sind die Textboxen auch deaktiviert.

    Gruß
    eddi
    Hallo
    Damit ich das nicht nachbauen muss. Kannst du ein Beispielprojekt hochladen? Dann schau ich mir das gerne mal an und bau dir das um.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hier mal das Testprojekt.
    Danke schon mal im Voraus.
    P.S. Das Projekt ist einfach gehalten und nur schnell im CodeBehind erstellt.

    Gruß

    eddi
    Dateien
    • StyleTest.zip

      (339,57 kB, 86 mal heruntergeladen, zuletzt: )

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

    Hallo

    Als erstes muss ich mal sagen das du OptionStrict auf ON stellen solltest. Dann fliegen dir deine Converter gleich mal um die Ohren.

    Du hast in deinem Style der Checkboxen versucht auf Schreibschutz zu binden.
    In der Ausgabe hat man auch schon die Bindingfehler gesehen, hier hättest du dann sicher auch schnell die Lösung gefunden, deshalb weise ich immer gerne darauf hin das man die Ausgabe beim Debuggen kontrollieren sollte.

    Quellcode

    1. System.Windows.Data Error: 40 : BindingExpression path error: 'Schreibschutz' property not found on 'object' ''TestKlasse' (HashCode=17230008)'. BindingExpression:Path=Schreibschutz; DataItem='TestKlasse' (HashCode=17230008); target element is 'CheckBox' (Name=''); target property is 'IsEnabled' (type 'Boolean')
    2. System.Windows.Data Error: 40 : BindingExpression path error: 'Schreibschutz' property not found on 'object' ''TestKlasse' (HashCode=44407631)'. BindingExpression:Path=Schreibschutz; DataItem='TestKlasse' (HashCode=44407631); target element is 'CheckBox' (Name=''); target property is 'IsEnabled' (type 'Boolean')
    3. System.Windows.Data Error: 40 : BindingExpression path error: 'Schreibschutz' property not found on 'object' ''TestKlasse' (HashCode=38891250)'. BindingExpression:Path=Schreibschutz; DataItem='TestKlasse' (HashCode=38891250); target element is 'CheckBox' (Name=''); target property is 'IsEnabled' (type 'Boolean')


    Und zwar kommt - wie man sieht - die Ausgabe für genau die Anzahl an Datensätzen im DataGrid. Wir sehen also sehr gut welchen Datenkontext die Checkbox in dem Moment hat (weil die Checkbox ja in einer ROW ist, also in einem Datensatz). Deshalb hat Sie auch TestKlasse als Datenkontext. Genau, ich wette jetzt klingelt es bei dir - nehme ich an.

    Die Eigenschaft Schreibschutz befindet sich ja in der CodeBehind vom MainWindow. Wie kommen wir an diesem? Richtig, per FindAncestor. Wir wissen ja das das MainWindow als Datenkontext genau die CodeBehind hat welche wir benötigen. Also suchen wir uns im ElementTree nach oben bis wir ein MainWindow bekommen. Und dort binden wir an den DataContext und dann an die Eigenschaft Schreibschutz.

    XML-Quellcode

    1. <Setter Property="IsEnabled" Value="{Binding DataContext.Schreibschutz, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}},Converter={StaticResource Bool_Invertierer_Key}}"/>


    Das wars schon.

    Achja, dein Converter Bool_Invertierer_Converter.
    Schreib den am besten wie folgt. Einfach und klappt mit OptionStrict On.

    VB.NET-Quellcode

    1. Public Class Bool_Invertierer_Converter
    2. Implements IValueConverter
    3. Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    4. If value Is Nothing OrElse Not Boolean.TryParse(value.ToString(), Nothing) Then Return False
    5. Return Not Boolean.Parse(value.ToString())
    6. End Function
    7. Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
    8. If value Is Nothing OrElse Not Boolean.TryParse(value.ToString(), Nothing) Then Return False
    9. Return Not Boolean.Parse(value.ToString())
    10. End Function
    11. End Class


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Au Backe!
    Thema "Option Strict On" sollte eigentlich schon seit fast 3 Monaten erledigt sein. Dachte ich... Leider war das vom Umbau des Projekts noch immer nur manuell in den einzelnen Klassen aktiviert und nicht projektweit und auch nicht für neue Projekte voreingestellt. Jetzt ist es endlich an beiden Stellen fest eingestellt. Zum Dank melden sich jetzt 16 alte Bekannte (Fehler), die ich ganz vergessen hatte.

    Habe meine falsche Bindung jetzt nochmal im richtigen Projekt eingefügt. Erst mal kein Fehler. Beim Wechsel auf den entsprechenden Tab mit der Tabelle gings dann aber los. Jetzt muss ich mal versuchen das in meinem Projekt umzusetzen. Mal sehen ob's klappt, bei dem anderen Aufbau.

    Converter: der Invertierer wurde wie von dir beschrieben übernommen. Der für die Sichbarkeit flog gleich ganz raus, weil es sowas fertig gibt. (zufällig gestern entdeckt)

    Vielen Dank für die Hilfe schonmal.

    Gruß
    eddi
    @eichseinet
    Obwohl ich den Blöd gelöst finde.

    Ich kann die Tage mal gerne meinen hier Online stellen. Bei dem kann man per Parameter bestimmen wie er sich verhalten soll.
    So das man ihn "Reversen" kann bzw. bestimmen kann ob nun Hidden oder Collapse gelten soll. wenn der Wert False ist.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##