C# WPF 多个复选框选中/取消选中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16117251/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WPF multiple checkbox check/uncheck
提问by user1434131
I have 4 checkboxes one check all and the other three are subcheckboxes. I wanted to check all three subcheckboxes when I check check all and when I deselect one check box the main checkbox check all will be unchecked only.
我有 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;
}
}
}
采纳答案by Arshad
My CheckBox gridlooks as:
我的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>
and i have two events, one for checkedand another for unchecked:
我有两个事件,一个用于checked,另一个用于unchecked:
bool m_bChkUpdating = false;
bool m_bUnChkUpdating = 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;
}
}
回答by Heysem Katibi
I think that you need CheckBoxin TreeView, this article will help you:
我认为你需要CheckBox在TreeView,这篇文章将帮助你:
回答by Alessandro Rossi
I suggest you to use a MVVM implementation. Where the model class holds label,selection status and a collection of the subItems model. In this way you could propagate the check event to the subItems. This may be an implementation:
我建议您使用 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;
}
}
}
}
Then in your XAML you could define a DataTemplate for the model class just created and then set an instance of the Model class as the ContentControl DataContext as follows.
然后在您的 XAML 中,您可以为刚刚创建的模型类定义一个 DataTemplate,然后将 Model 类的一个实例设置为 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>
This is the Code-Bihind
这是 Code-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;
}
}
}
This is how it will look like
这就是它的样子


回答by Sergio Perez
Is very simply with Click Event.
用点击事件很简单。
Here an exmaple with 2 Checkbox:
这是一个带有 2 个复选框的示例:
- chbox_presis the first Checkbox.
- chbox_devis the second Checkbox.
- valor_presand valor_devare blobal variables to save the value of each Checkbox.
- chbox_pres是第一个Checkbox。
- chbox_dev是第二个Checkbox。
- valor_pres和valor_dev是用于保存每个Checkbox值的 blobal 变量。
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);
}
}
You can adapt to as many as you want.
您可以根据需要适应任意数量。

