Hallo, C#-Community,
zuerst einmal muss ich sagen, dass ich ein C#-Anfänger bin.
Nun zur meiner Frage bzw. meinem Problem:
Ich habe 10 Checkboxes und diese möchte ich alle nach der .IsChecked - Eigenschaft abfragen, um darauf ein Array mit ausgewählten Zahlen zu füllen.
Ich habe eine Lösung über eine einfache if-Anweisung gefunden, die ist aber extrem lang und um ehrlich zu sein "unschön". Die Checkboxes wurden in XAML einzeln erstellt:
<CheckBox x:Name="check1" Content="Lektion 1" HorizontalAlignment="Left" Margin="62,68,0,0" VerticalAlignment="Top"/>
also nach diesem Beispiel.
int[] ins = new int[9];
if (check1.IsChecked == true)
{
ins[0] = 1;
}
else
{
ins[0] = 0;
}
if (check2.IsChecked == true)
{
ins[1] = 2;
}
else
{
ins[1] = 0;
}
Die im Codebeispiel gezeigten Einheiten (logischerweise ohne die Deklaration und Initialisierung des Arrays) wurden für jede einzelne -der 10 Checkboxes- erstellt, was echt viel (unnützen?) Code mit sich bringt.
Deswegen frage ich mich bzw. euch, ob man das auch durch eine Schleife oder Ähnliches/Anderes lösen kann?
Ich erwarte hier -gemäß der Regeln- auch keine vollendete Lösung und bin dankbar für jeden Tipp, da ich nach langer Suche im Internet und auch mit der Benutzung der "Suchen-Funktion" keine Ergebnisse fand.
In WPF und XAML solltest Du immer mit dem MVVM Pattern und Datenbindung arbeiten - immer.
Das gesamte Konzept von WPF basiert darauf. Und Du hast richtig erkannt: Du brauchst sehr viel Code, wenn Du dies nicht machst - hinzu kommen unzählige Workarounds, die benötigt werden.
[Artikel] MVVM und DataBinding
Das Problem würde sich bei MVVM gar nicht erst ergeben.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke, für deine Antwort.
Werde mich in das Thema MVVM direkt mal einlesen.
So könnte man es machen. Willst du nur angewählte Checkboxen filtern, dann kannst Du im Lambda die Kommentarzeichen entfernen.
Im Xaml habe ich den Checkboxen in der Tag-Eigenschaft je einen Wert zugewiesen, der dann in der Schleife für die Nummer und den Array Index herangezogen wird.
Die Checkboxen liegen bei mir im Xaml in einem Stackpanel mit Namen stack - Variable im Lambda
int[] ins = new int[9];
var checkBoxes = stack.Children.OfType<CheckBox>();//.Where(cb => cb.IsChecked ?? false);
foreach (CheckBox checkbox in checkBoxes)
{
int number = int.Parse((string)checkbox.Tag);
int index = number--;
if (checkbox.IsChecked.HasValue && checkbox.IsChecked.Value)
{
ins[index] = number;
}
else
{
ins[index] = 0;
}
}
Und bitte angewöhnen das "== true" wegzulassen, denn es genügt zu schreiben "wenn die Box gecheckt ist", statt "wenn es wahr ist dass die Box gecheckt ist" 😉
Danke, für den Hinweis, chilic.
Ist mir bis jetzt tatsächlich noch gar nicht aufgefallen, macht ja aber doch Sinn.
Vielen Dank, Cavemen, für deine Lösung.
Habe sie direkt mal ausprobiert und sie funktioniert - wie erwartet. 😉
Grüße
SharpLat