Bindingfehler ignorieren? Fragen zum Programmierstil

  • WPF
  • .NET (FX) 4.5–4.8

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

    Bindingfehler ignorieren? Fragen zum Programmierstil

    Hallo Leute.

    In meinem Programm befinden sich seit längerer Zeit mehrere Auswahllisten, wovon jede in einer ComboBox untergebracht ist. Hier der Aufbau der Box.

    XML-Quellcode

    1. <ComboBox x:Name="CB_Objektiv" ItemsSource="{Binding FI.Auswahl_Objektiv}">
    2. <ComboBox.ItemTemplate>
    3. <DataTemplate>
    4. <CheckBox IsChecked="{Binding Aktiv}" Content="{Binding Wert}" VerticalAlignment="Center"/>
    5. </DataTemplate>
    6. </ComboBox.ItemTemplate>
    7. </ComboBox>

    Vorgestern wurde folgender Style noch hinzugefügt, um die Checkboxen über die gesamte Breite des Aufgeklappten Bereichs auszudehnen. (so kann die CheckBox überall aktiviert/deaktiviert werden)

    XML-Quellcode

    1. <Style TargetType="{x:Type ComboBoxItem}">
    2. <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    3. </Style>


    Es funktioniert auch alles.
    Allerdings werden die an die „ItemsSource“ gebundenen OberservableCollections machmal komplett geleert und neu aufgebaut. (die enthaltene Auswahl wird den Vorhandenen Auswahlmöglichkeiten angepasst/aktualisiert). Außerdem kommen leere Collections vor, weil es in einigen Kategorien wg. der bisherigen Auswahl keine weiteren Auswahlmöglichkeiten mehr gibt. Wenn die Collection leer ist, erscheinen dann immer Bindingfehler. Sie entstehen durch den Style. Wenn der entfernt wird, treten auch keine Fehler auf.
    Nun Frage ich mich, ob man das so lassen soll und kann? Ich denke es ist ein schlechter Stil, wenn hier immer wieder Bindingfehler auftreten, auch wenn sie das Programm eigentlich nicht beeinflussen.
    Als Alternative könnte man die MinWidth der CheckBox auf die Breite der ComboBox binden. Das funktioniert ohne Fehler. Allerdings füllen die CheckBoxen dann halt nicht die volle Breite des aufgeklappten Bereichs aus.
    Mich interessiert mal was ihr so dazu meint.
    Diese meine ich. Die Collection wurde ursprünglich über Collection.Clear geleert und neu aufgebaut. Habe dann mal mit For each einzeln gelöscht. Bei For each erscheint erst beim letzten Item EIN Bindingfehler. Bei .Clear erscheint für jedes Item in der Collection ein Bindingfehler.
    Bilder
    • Screenshot 2024-07-15 211217.jpg

      5,27 kB, 361×63, 22 mal angesehen
    Dein Projekt ist für mich etwas ungewohnt. Außerdem fehlen bie mir einige Pakete, um es auszuführen. Der Versuch eine ListCollectionView statt der Collection oder der ICollectionView zu binden ändert nichts.
    Das muss ich mir wohl nochmal mit viel Zeit ansehen...

    Trotzdem Danke für die Hilfe

    Nachtrag: Weil du die Methode über einen Button anstösst, habe ich das jetzt auch mal versucht. Sieha da; keine Fehler. Sobald die Combobox aber einmal offen war tritt auch hier der Fehler auf.

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

    eichseinet schrieb:

    Außerdem fehlen bie mir einige Pakete, um es auszuführen
    Was denn z.B.? Das ist eigentlich so Vanilla wie ich es mir bisher vorstellen kann.

    eichseinet schrieb:

    Sobald die Combobox aber einmal offen war tritt auch hier der Fehler auf
    Ich werde das auch nochmal testen, bin nicht sicher, ob ich das gemacht habe.
    Der Button muss man sagen ist eigenwillig, ich wollte da jetzt kein Relaycommand für hinbasteln, sondern habn einfach klassisch mit Event angestöpselt

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

    Der Designer beschwert sich über fehledne "Assemblyverweise".
    Hab das jetzt trotzdem mal einfach gestartet. Dann steht da was von ".net8". Bei mir ist noch Framework 4.8.1 drauf.
    Bei meinem Test mit einem Button wurde es über einen RelayCommand ausgeführt.

    Leider hab ich für die nächsten Stunden keine Zeit mehr mich drum zu kümmern.
    Also entweder später oder sogar erst morgen dann weitere Tests...
    Ah ok das Framework, naja ich kanns dir nochmal in Net4.8 hochladen später, falls ich weiterhin keine Fehler reproduzieren kann

    Edit
    Ja also es liegt nicht am Style oder am Button. Hab jetzt auch n Relaycommand reingedrückt.
    Auf NET 8 sowie FX4.8, keine Fehler
    Dateien
    • WpfApp3.zip

      (12,59 kB, 40 mal heruntergeladen, zuletzt: )

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

    Ich hatte sowas auch mal mit einem ListView, da hatte ich ein ItemTemplate angelegt, ab und zu hatte ich dann auch was dazu in der Ausgabe. Ich wusste noch welche Stelle es war und habe die paar Zeilen eben entfernt. Sofort beim filtern der Collection unzählige Bindingsfehler. Siehe auf dem Bild im Anhang.

    Dann habe ich das dem ListView hinzugefügt und dann war Ruhe. Vllt. siehst du ja parallelen bei dir die dir helfen das zu fixen. Sonst musst du uns mehr Daten geben, vllt. sehe ich das dann.

    XML-Quellcode

    1. <ListView .......>
    2. <ListView.Resources>
    3. <Style TargetType="ListViewItem">
    4. <Setter Property="HorizontalContentAlignment" Value="Center" />
    5. <Setter Property="VerticalContentAlignment" Value="Top" />
    6. </Style>
    7. </ListView.Resources>
    8. <ListView.ItemContainerStyle>
    9. <Style TargetType="ListViewItem">
    10. <Setter Property="HorizontalContentAlignment" Value="Center" />
    11. <Setter Property="VerticalContentAlignment" Value="Top" />
    12. </Style>
    13. </ListView.ItemContainerStyle>


    Da mir die ganzen Bindingsfehler die übersicht nahmen, hatte ich die Priorität das zu fixen recht hoch angesetzt, weil das das einzige war, was bei mir Bindungsfehler verursachte. So konnte ich nicht wirklich erkennen oben in der titlebar, ob ich nun an anderer Stelle einen hab, was das arbeiten negativ beeinflusst hat. Solange alles läuft, könnte man sowas drin lassen. Aber das kann sich rächen, in welcher Form auch immer. Ich würds schnellstmöglich versuchen zu fixen.
    Bilder
    • Unbenannt.jpg

      171,58 kB, 2.816×258, 23 mal angesehen
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Vielen Dank an Haudruferzappeltnoch!
    Mit dem Projekt hats gerade mal 2min. gedauert, bis es ging! Eigentlich konnte ich da nix ungewöhnliches dran sehen. Es sieht zwar alles ein bischen anders aus als bei mir, aber an der Funktion sollte es nichts ändern. Dein Projekt funktionierte auch bei mir. Also hab ich mal begonnen es an mein Projekt anzupassen und landete sofort einen Treffer.
    Es ist die Art wie der Style eingebunden ist. Weil er für alle ComboBoxen gelten soll wurde einfach nur ein Style ohne Key erstellt. (siehe Post #1)
    Wirft man in deinem Projekt den Key raus, tritt der Fehler sofort auf. Also ist der Style jetzt über den Key eingebunden und es funktioniert bisher.
    Den Sinn versteh ich zwar nicht, aber egal.
    Ich hatte heute selbst mehrere Testprojekte erstellt, u.a. auch unter Visual Studio 2022 und mit .Net Core 6.0, aber alle Test waren erfolglos.

    Nochmal schönen Dank euch beiden!
    Ein Style mit Targettyp XY gilt einfach für ALLE Controls von diesem Typ, die in der Vererbung darunter liegen.
    Mit dem Key kann man einzeln für jedes Control entscheiden, ob es diesen Style nutzen soll.
    Weil in meinem Fall alle 11 Comboboxen im gleichen UserControl den Style nutzen sollten, wurde dieser in den Resourcen des Grids ohne Key angelegt. So hab ichs gelernt und hatte noch nie Probleme damit.