WPF più checkbox check/uncheck

Ho 4 caselle di controllo un controllo di tutti e gli altri tre sono subcheckboxes. Ho voluto controllare tutti e tre i subcheckboxes quando controllo il controllo di tutti e quando ho deselezionare una casella di controllo la casella di controllo principale controllare tutti sarà disabilitata.

<Window x:Class="checkboxWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">

  <Grid Name="grdOne">
    <CheckBox Content="Check"
              Checked="checkBox1_Checked"
              Unchecked="checkBox1_Unchecked"
              Height="16"
              HorizontalAlignment="Left"
              Margin="39,23,0,0"
              Name="checkBox1"
              VerticalAlignment="Top">
    </CheckBox>
    <CheckBox Content="One"
              Unchecked="checkBox2_Unchecked"
              IsChecked="{Binding Path=Ischecked, ElementName=checkBox1, Mode=TwoWay}"
              Height="16"
              HorizontalAlignment="Left"
              Margin="117,67,0,0"
              Name="checkBox2"
              VerticalAlignment="Top" />
    <CheckBox Content="Two"
              Unchecked="checkBox3_Unchecked"
              IsChecked="{Binding Path=Ischecked, ElementName=checkBox1, Mode=TwoWay}"
              Height="16"
              HorizontalAlignment="Left"
              Margin="118,103,0,0"
              Name="checkBox3"
              VerticalAlignment="Top" />
    <CheckBox Content="Three"
              IsChecked="{Binding Path=Ischecked, ElementName=checkBox1, Mode=TwoWay}"
              Height="16"
              HorizontalAlignment="Left"
              Margin="117,145,0,0"
              Name="checkBox4"
              VerticalAlignment="Top" />
    <CheckBox Content="Four"
              IsChecked="{Binding Path=Ischecked, ElementName=checkBox1, Mode=TwoWay}"
              Height="16"
              HorizontalAlignment="Left"
              Margin="118,190,0,0"
              Name="checkBox5"
              VerticalAlignment="Top" />
  </Grid>
</Window>
 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        private void checkBox1_Checked(object sender, RoutedEventArgs e)
        {
            if (checkBox1.IsChecked == true)
            {
                checkBox2.IsChecked = true;
                checkBox3.IsChecked = true;
            }
        }

        private void checkBox1_Unchecked(object sender, RoutedEventArgs e)
        {
            //if (checkBox1.IsChecked == false)
            //{
            //   checkBox2.IsChecked = false;
            //   checkBox3.IsChecked = false;
            //}
        }

        private void checkBox2_Unchecked(object sender, RoutedEventArgs e)
        {
            if (checkBox2.IsChecked == false)
            {
                checkBox1.IsChecked = false;
            }
        }

        private void checkBox3_Unchecked(object sender, RoutedEventArgs e)
        {
            if (checkBox3.IsChecked == false)
            {
                checkBox1.IsChecked = false;
            }
        }
    }
qual è il tuo problema?

OriginaleL’autore user1434131 | 2013-04-20

4 Replies
  1. 5

    Mio CheckBox grid sembra:

     <Grid Name="grdOne">
        <CheckBox Content="Check" Height="16" HorizontalAlignment="Left" Margin="24,44,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
        <CheckBox Content="One" Height="16" HorizontalAlignment="Left" Margin="64,77,0,0" Name="checkBox2" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
        <CheckBox Content="Two" Height="16" HorizontalAlignment="Left" Margin="64,99,0,0" Name="checkBox3" VerticalAlignment="Top" Unchecked="checkBox1_Unchecked" Checked="checkBox1_Checked" />
        <CheckBox Content="Three" Height="16" HorizontalAlignment="Left" Margin="64,121,0,0" Name="checkBox4" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
        <CheckBox Content="Four" Height="16" HorizontalAlignment="Left" Margin="64,143,0,0" Name="checkBox5" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
    </Grid>

    e ho due eventi, uno per checked e un altro per unchecked:

    bool m_bChkUpdating = false;

    bool m_bUnChkUpdating = false;

    private void checkBox1_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox chk = (CheckBox)sender;
    
        if (!m_bChkUpdating)
        {
            m_bChkUpdating = true;
            switch (chk.Name)
            {
                case "checkBox1":
                    checkBox2.IsChecked = true;
                    checkBox3.IsChecked = true;
                    checkBox4.IsChecked = true;
                    checkBox5.IsChecked = true;
                    break;
                default:
                    // chk.IsChecked = true;
                    if (checkBox2.IsChecked == true &&
                        checkBox3.IsChecked == true &&
                        checkBox4.IsChecked == true &&
                        checkBox5.IsChecked == true)
                    {
                        checkBox1.IsChecked = true;
                    }
                    else
                    {
                        checkBox1.IsChecked = false;
                    }
                    break;
            }
            m_bChkUpdating = false;
        }
    
    }
    
    private void checkBox1_Unchecked(object sender, RoutedEventArgs e)
    {
        CheckBox chk = (CheckBox)sender;
        if (!m_bUnChkUpdating)
        {
            m_bUnChkUpdating = true;
    
            switch (chk.Name)
            {
                case "checkBox1":
                    checkBox2.IsChecked = false;
                    checkBox3.IsChecked = false;
                    checkBox4.IsChecked = false;
                    checkBox5.IsChecked = false;
                    break;
                default:
                    //chk.IsChecked = false;
                    if (checkBox2.IsChecked == false ||
                        checkBox3.IsChecked == false ||
                        checkBox4.IsChecked == false ||
                        checkBox5.IsChecked == false)
                    {
                        checkBox1.IsChecked = false;
                    }
                    else
                    {
                        checkBox1.IsChecked = true;
                    }
                    break;
            }
    
            m_bUnChkUpdating = false;
        }
    }    
    Grazie. Ho solo bisogno ora è quando tutto è controllato poi ho deselezionato uno qualsiasi dei checkbox 2 a casella 4 sarà solo deselezionare la casella di controllo principale/casella di controllo 1 non le altre caselle di controllo. Grazie ancora per l’aiuto di tutti.

    OriginaleL’autore Arshad

  2. 4

    Io suggerisco di usare una MVVM attuazione. Dove il modello di classe contiene etichetta,la selezione e la raccolta di elementi del modello. In questo modo si potrebbe propagare l’evento di controllo per gli elementi secondari. Questo può essere un’implementazione:

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Checks
    {
        class ChecksModel : INotifyPropertyChanged
        {
            public ChecksModel(string label, bool status)
            {
                Children = new ObservableCollection<ChecksModel>();
                Label = label;
                IsChecked = status;
            }
            public ChecksModel(string label)
                : this(label, false)
            {
            }
    
            public ChecksModel()
            {
                Children = new ObservableCollection<ChecksModel>();
            }
            public void AddChild(ChecksModel child)
            {
                Children.Add(child);
            }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
    
            private ObservableCollection<ChecksModel> _Children;
            public ObservableCollection<ChecksModel> Children
            {
                get
                {
                    return _Children;
                }
                set
                {
                    _Children = value;
                    OnPropertyChanged("Children");
                }
            }
            private string _Label;
            public string Label
            {
                get
                {
                    return _Label;
                }
                set
                {
                    _Label = value;
                    OnPropertyChanged("Label");
                }
    
            }
            private bool _IsChecked;
            public bool IsChecked
            {
                get
                {
                    return _IsChecked;
                }
                set
                {
                    _IsChecked = value;
                    OnPropertyChanged("IsChecked");
                    CheckNodes(value);
                }
            }
            private void CheckNodes(bool value)
            {
                foreach (ChecksModel m in _Children)
                {
                    m.IsChecked = value;
                }
            }
        }
    }

    Quindi in XAML si potrebbe definire un modello di dati per il modello di classe appena creata e quindi impostare un’istanza della classe del Modello come ContentControl DataContext come segue.

        xmlns:local="clr-namespace:Checks"
    
        Title="MainWindow">
    <Window.Resources>
        <DataTemplate 
              DataType="{x:Type local:ChecksModel}">
            <StackPanel>
                <CheckBox 
                        IsChecked="{Binding IsChecked, Mode=TwoWay}" 
                        Content="{Binding Label, Mode=OneWay}"/>
                <ItemsControl Margin="10,0,0,0" 
                         ItemsSource="{Binding Children}"/>
            </StackPanel>
        </DataTemplate>
    
    </Window.Resources>
    <Grid Name="grdOne">
    
        <ContentControl Content="{Binding}"/>
    
    
    </Grid>

    Questo è il Codice-Bihind

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    using System.Collections.ObjectModel;
    
    namespace Checks
    {
        ///<summary>
        ///Logica di interazione per MainWindow.xaml
        ///</summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                ChecksModel model = new ChecksModel("Main");
                ChecksModel m1 = new ChecksModel("Branch");
                m1.AddChild(new ChecksModel("1st"));
                m1.AddChild(new ChecksModel("2nd"));
                model.AddChild(m1);
                model.AddChild(new ChecksModel("3rd"));
                model.AddChild(new ChecksModel("4th"));
    
                DataContext = model;
            }
        }
    }

    Questo è come apparirà

    WPF più checkbox check/uncheck

    Grazie per la tua risposta.

    OriginaleL’autore Alessandro Rossi

  3. 0

    È, molto semplicemente, con l’Evento Click.

    Qui un esempio con 2 Casella:

    • chbox_pres è il primo Casella di controllo.
    • chbox_dev è il secondo Casella di controllo.
    • valor_pres e valor_dev sono blobal variabili per salvare il valore di ogni Casella di controllo.

    private void Chbox_Click(object sender, RoutedEventArgs e)
    {
        CheckBox chk = (CheckBox)sender;
    
        string name = chk.Name;
    
        if (name == "chbox_pres")
        {
            valor_pres = chbox_pres.IsChecked ?? false;
            chbox_dev.IsChecked = !valor_pres;
            valor_dev = !valor_pres;
            Debug.WriteLine("<< pres: pres = " + valor_pres + ", dev= " + valor_dev);
        }
        else
        {
            valor_dev = chbox_dev.IsChecked ?? false;
            chbox_pres.IsChecked = !valor_dev;
            valor_pres = !valor_dev;
            Debug.WriteLine("<< dev: pres = " + valor_pres + ", dev= " + valor_dev);
        }            
    }      

    Si può adattare come molti come si desidera.

    OriginaleL’autore Sergio Perez

Lascia un commento