Liste von Bool an eine Anzahl Checkboxen binden

  • WPF
  • .NET (FX) 4.5–4.8

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

    Liste von Bool an eine Anzahl Checkboxen binden

    Hallo Forum,

    ich programmiere nicht mehr regelmäßig - zu viel anderen Quuatsch zu tun. Daher stehe ich jetzt aktuell etwas verloren da.

    Ich möchte eine Liste aus Bool an Checkboxen binden und über einen IValueConverter die einzelnen indizees der Liste manipulieren.
    So die Idee.

    Das Problem liegt für mich im ConvertBack des Converters, denn dieser gibt mir nicht die Liste der Bool, sondern nur den aktuellen Zustand des gerade manipulierten bool.
    Hoffe Ihr versteht.

    Das Problem ist an sich gelöst, aber unschön wie ich finde.
    Es geht nur wenn ich mir die Liste als Static im Converter merke.

    C#-Quellcode

    1. public class IndexOfArrayToValueConverter : IValueConverter
    2. {
    3. private static List<bool> staticListOfBool;
    4. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    5. {
    6. int par = int.Parse((string)parameter);
    7. List<bool> list = (List<bool>)value;
    8. staticListOfBool = list;
    9. return list[par -1];
    10. }
    11. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    12. {
    13. int par = int.Parse((string)parameter);
    14. bool val = (bool)value;
    15. staticListOfBool[par - 1] = val;
    16. return staticListOfBool;
    17. }
    18. }


    Wegen der Volständigkeit noch das XAML dazu

    XML-Quellcode

    1. <CheckBox x:Name="Protocol_1" Content="1 - Product detection" IsChecked="{Binding ProtokollSelected, Mode=TwoWay, Converter={StaticResource IndexOfArrayToValueConverter}, ConverterParameter=1}"/>
    2. <CheckBox x:Name="Protocol_2" Content="2 - New barcode" IsChecked="{Binding ProtokollSelected, Converter={StaticResource IndexOfArrayToValueConverter}, ConverterParameter=2}"/>
    3. <CheckBox x:Name="Protocol_5" Content="5 - New product weight" IsChecked="{Binding ProtokollSelected, Converter={StaticResource IndexOfArrayToValueConverter}, ConverterParameter=5}"/>
    4. <CheckBox x:Name="Protocol_6" Content="6 - New Product volume" IsChecked="{Binding ProtokollSelected, Converter={StaticResource IndexOfArrayToValueConverter}, ConverterParameter=6}"/>


    Vielleicht hat jemand eine Idee.

    Gruss

    mikeb69

    CodeTags korrigiert ~VaporiZed

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

    Wenn du die Sammlung aus dem Konverter rauslässt, hast du folgendes Problem:
    Du bindest an eine Checkbox eine Sammlung, dem Konverter ist die Sammlung nicht bekannt. In Convert() ist die Sammlung das Argument, in Convert() ist die Liste deswegen bekannt.
    In ConvertBack ist die Property IsChecked das Argument, es gibt also keine Sammlung in die man Änderungen melden könnte.
    Also musst du es so lassen.

    Ich denke eigentlich brauchst du ein Control, das ganz gewöhnlich an die Sammlung binden kann und sowas wie CurrencyManagement hat. Eine Listbox z.B.
    Vermutlich kann man sowas auch selbst basteln als UserControl, aber da hören meine Kenntnisse auf. In der Tutorialsektion hat Nofear aber gezeigt, dass man mit Listbox schon Einiges machen kann, was das aussehen angeht. Vielleicht ist das gut genug.

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

    mikeb69 schrieb:

    Ich möchte eine Liste aus Bool an Checkboxen binden und über einen IValueConverter die einzelnen indizees der Liste manipulieren.
    Wie kann man denn Indizees manipulieren?
    Das Element an 6. Stelle in einer Liste hat den Index 5. Wie soll man das manipulieren? Soll es den Index 4 bekommen? Dazu muss man es auf die 5. Stelle verschieben (wodurch sich der Index des Elements ändert, was vorher da war).

    Aber deim Xaml glaube ich entnehmen zu können, dass du eine Liste von Protokollen anzeigen und anhaken willst, und das Anhaken soll auch gemerkt werden.
    In Wpf würde man ein geeignetes Viewmodel basteln mit einer List(Of Protocol), und so ein Protocol hätte als Properties etwa Name und IsChecked.
    Diese List(Of Protocol) bindet man an eine Listbox.
    Und der Listbox gibt man als DataTemplate eine Checkbox, deren Text an Protocol.Name gebunden ist, und deren IsChecked-Property an Protocol.IsChecked
    Du könntest statt Listbox auch Datagrid nehmen, ich glaub da werden sogleich geeignete Spalten generiert.
    (Falls nicht, muss man halt welche hinmachen)

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