Zum Inhalt
Kuonen.UI

CheckedListBox

Eine Liste mit einem Kästchen je Eintrag, wie in WinForms. Ein Klick auf das Kästchen kreuzt an, ein Klick auf den Text wählt (mit „CheckOnClick“ kreuzt jeder Klick an); die Leertaste kreuzt den Eintrag mit dem Fokus an. ItemCheck kommt vor jeder Änderung und darf sie ablehnen: hier bleibt „Zitronen“ immer leer.

Vorführung: CheckedListBoxVorführung: CheckedListBox

KXAML

CheckedListBoxSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            xmlns:local="using:Kuonen.UI.Galerie.Seiten"
            x:Class="Kuonen.UI.Galerie.Seiten.CheckedListBoxVorfuehrung"
            Spacing="12">
  <CheckBox Content="Jeder Klick kreuzt an (CheckOnClick)" Checked="JederKlick_Checked" Unchecked="JederKlick_Unchecked" />
  <!-- ItemCheck kommt vor jeder Änderung und darf sie ablehnen. -->
  <CheckedListBox x:Name="Liste" Width="240" Height="180" ItemsSource="{x:Static local:CheckedListBoxVorfuehrung.Obst}" ItemCheck="Liste_ItemCheck" />
  <TextBlock x:Name="Meldung" Text="Nichts angekreuzt." />
</StackPanel>
CheckedListBoxSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

public sealed partial class CheckedListBoxSeite
{
    protected override Func<UIElement>? KxamlFabrik => () => new CheckedListBoxVorfuehrung();
}

/// <summary>KXAML-Fassung der CheckedListBox-Seite: der Baum steht in CheckedListBoxSeite.kxaml, hier die Daten und das Verhalten.</summary>
public sealed partial class CheckedListBoxVorfuehrung
{
    /// <summary>Die Einträge (im KXAML über x:Static).</summary>
    public static readonly string[] Obst = ["Äpfel", "Birnen", "Kirschen", "Pflaumen", "Quitten", "Zitronen"];

    public CheckedListBoxVorfuehrung() => InitializeComponent();

    // ItemCheck kommt vor der Änderung: „Zitronen“ wird abgelehnt, der Text zählt mit dem neuen Zustand.
    private void Liste_ItemCheck(object? sender, ItemCheckEventArgs e)
    {
        if (Equals(Liste.Items[e.Index], "Zitronen")) e.NewValue = e.CurrentValue;
        int anzahl = Liste.CheckedItems.Count + (e.NewValue != CheckState.Unchecked ? 1 : 0) - (e.CurrentValue != CheckState.Unchecked ? 1 : 0);
        Meldung.Text = anzahl == 0 ? "Nichts angekreuzt." : $"{anzahl} angekreuzt.";
    }

    private void JederKlick_Checked(object sender, RoutedEventArgs e) => Liste.CheckOnClick = true;

    private void JederKlick_Unchecked(object sender, RoutedEventArgs e) => Liste.CheckOnClick = false;
}

C#

CheckedListBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: <see cref="CheckedListBox"/>.</summary>
public sealed partial class CheckedListBoxSeite : GalerieSeite
{
    public override string Titel => "CheckedListBox";

    public override string Beschreibung =>
        "Eine Liste mit einem Kästchen je Eintrag, wie in WinForms. Ein Klick auf das Kästchen kreuzt an, ein Klick auf den Text wählt "
        + "(mit „CheckOnClick“ kreuzt jeder Klick an); die Leertaste kreuzt den Eintrag mit dem Fokus an. ItemCheck kommt vor jeder Änderung "
        + "und darf sie ablehnen: hier bleibt „Zitronen“ immer leer.";

    public override string Stichworte => "Kontrollkästchen Liste CheckedItems CheckedIndices CheckOnClick ItemCheck CheckState WinForms";

    public override string Datei => nameof(CheckedListBoxSeite);

    public override UIElement Baue()
    {
        var liste = new CheckedListBox { Width = 240, Height = 180, ItemsSource = new[] { "Äpfel", "Birnen", "Kirschen", "Pflaumen", "Quitten", "Zitronen" } };
        var meldung = new TextBlock { Text = "Nichts angekreuzt." };
        liste.ItemCheck += (_, e) =>
        {
            // ItemCheck kommt vor der Änderung: „Zitronen“ wird abgelehnt, der Text zählt mit dem neuen Zustand.
            if (Equals(liste.Items[e.Index], "Zitronen")) e.NewValue = e.CurrentValue;
            int anzahl = liste.CheckedItems.Count + (e.NewValue != CheckState.Unchecked ? 1 : 0) - (e.CurrentValue != CheckState.Unchecked ? 1 : 0);
            meldung.Text = anzahl == 0 ? "Nichts angekreuzt." : $"{anzahl} angekreuzt.";
        };
        var jederKlick = new CheckBox { Content = "Jeder Klick kreuzt an (CheckOnClick)" };
        jederKlick.Checked += (_, _) => liste.CheckOnClick = true;
        jederKlick.Unchecked += (_, _) => liste.CheckOnClick = false;

        var seite = new StackPanel { Spacing = 12 };
        seite.Children.Add(jederKlick);
        seite.Children.Add(liste);
        seite.Children.Add(meldung);
        return seite;
    }
}