3

我有 4 个复选框,一个全选,另外三个是子复选框。当我检查全部时,我想检查所有三个子复选框,当我取消选择一个复选框时,主复选框检查全部将被取消选中。

<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;
            }
        }
    }
4

4 回答 4

5

我的CheckBox grid样子:

 <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>

我有两个事件,一个用于checked,另一个用于unchecked

bool m_bChkUpdating = false;

布尔 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;
    }
}    
于 2013-04-20T07:27:37.690 回答
5

我建议您使用 MVVM 实现。模型类在哪里保存标签、选择状态和子项模型的集合。通过这种方式,您可以将检查事件传播到子项。这可能是一个实现:

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;
            }
        }
    }
}

然后在您的 XAML 中,您可以为刚刚创建的模型类定义一个 DataTemplate,然后将模型类的一个实例设置为 ContentControl DataContext,如下所示。

    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>

这是代码隐藏

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;
        }
    }
}

这就是它的样子

在此处输入图像描述

于 2013-04-20T11:13:27.827 回答
0

我认为你需要CheckBoxTreeView这篇文章会帮助你:

在 WPF TreeView 中使用复选框

于 2013-04-20T10:15:03.243 回答
0

很简单的点击事件。

这是一个带有 2 个复选框的示例:

  • chbox_pres是第一个Checkbox
  • chbox_dev是第二个Checkbox
  • valor_presvalor_dev是保存每个Checkbox值的全局变量。

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);
    }            
}      

您可以根据需要适应任意数量。

于 2019-01-28T06:04:53.213 回答