C#WPF取消选中复选框

我使用MS Visual 2013 Express,C#和WPF。

在我的程序中有六个复选框,当选中其中一个时,其他五个应该取消选中。

我用谷歌搜索了最近两个小时,但在C#中找不到作为初学者的解决方案。 在java中,我只想写checkbox1.setSelected(false);

我在C#代码中添加了一个clickevent,一个经过检查和未经检查的evet。 我在.xaml中添加了CheckedUnchecked ,但是我不知道它能让它工作。

希望你能帮我 :)

=======================

我的解决方案

谢谢您的帮助。 我尝试了一些你建议使用“IsChecked”的随机内容并让它幸运地工作。

.Xaml看起来像:

        

CheckBox1的C#代码:

  private void CheckBox1_Checked(object sender, RoutedEventArgs e) { CheckBox1.IsChecked = true; CheckBox2.IsChecked = false; CheckBox3.IsChecked = false; CheckBox4.IsChecked = false; CheckBox5.IsChecked = false; CheckBox6.IsChecked = false; } 

例如,对于CheckBox2:

  private void CheckBox2_Checked(object sender, RoutedEventArgs e) { CheckBox2.IsChecked = true; CheckBox1.IsChecked = false; CheckBox3.IsChecked = false; CheckBox4.IsChecked = false; CheckBox5.IsChecked = false; CheckBox6.IsChecked = false; } 

所以最后,这是一项非常容易的任务。

 checkbox1.IsChecked = false; 

ToggleButton.IsChecked属性

我正在读它作为一个特殊的,取消其他5。
如果你想一次只检查一个,那么RadioButton会这样做。
默认情况下,您无法取消选中RadioButton。
这将允许所有6个未经检查。

我认为绑定更好并实现INotifyPropertyChanged

 private Bool cbSecial = false; private Bool cb1 = false; private Bool cb2 = false; public Bool CbSpecial { get { return cbSecial; } set { if (value == cbSecial) return; cbSecial = value; if (cbSpecial) { Cb1 = false; Cb2 = false; ... } NotifyPropertyChanged("CbSpecial"); } } public Bool Cb1 { get { return cb1; } set { if (value == cb1) return; cb1 = value; NotifyPropertyChanged("Cb1 "); } } 

BradleyDotNET是正确的 – 在组中取消选中任何给定的CheckBox其余部分基本上是RadioButton的function,并且您最终不需要做任何事情来实现这种行为。

但是,如果您真的想要使用CheckBoxes,那么您可以实现的一种方法是在您的ViewWodel中的属性中保持对每个CheckBox IsChecked值的引用,并且还保留您的六个内部IEnumerable价值观,如下:

 private bool? checkBox1IsChecked = false; public bool? CheckBox1IsChecked { get { return checkBox1IsChecked; set { UncheckAllCheckBoxes(); checkBox1IsChecked = true; } } public bool? CheckBox2IsChecked { get; set; } ... // include 1 through 6 here private List yourCheckStates = new List { checkBox1IsChecked, ... }; 

每当其中一个状态发生变化时,你就可以使用类似的东西:

 private void UncheckAllCheckBoxes() { foreach (bool? cbIsChecked in yourCheckStates) { cb.IsChecked = false; } } 

然后设置刚刚更改为true的值。 每次选中复选框时,将始终取消选中其他五个复选框。

编辑:如果我误读了这个,就像Blam建议的那样,你的意思是一个CheckBox特别取消所有其他的CheckBox ,那么只包含对该特定CheckBox的IsChecked值的属性中的UncheckAllCheckBoxes()的调用,并添加一行在所有其他setter中将一个特殊CheckBox的IsChecked设置为false。

您可以通过以下两种方式之一:

  1. RadioButton在一个小组中
  2. 具有自定义ItemTemplate Selector

单选按钮:

    

选择:

        

注意:我选择ListBox作为示例,但您可以选择从Selector派生的任何内容。

  { if (CheckBox1.Checked) {Label1.Text = "Checked Apple"; } if (CheckBox1.Checked == false) { Label1.Text = "Unchecked Apple"; } } protected void CheckBox2_CheckedChanged(object sender, EventArgs e) { if (CheckBox2.Checked) { Label1.Text = "Checked Banana"; } if (CheckBox2.Checked == false) { Label1.Text = "Unchecked Banana"; } } 

你可能会觉得这很有用。 我有一个“Logging Level”wpf菜单,我希望一次只激活1个选择(即选中时取消选中所有其他菜单项)。 我的诀窍是在xaml中使用FindName()方法和“tag”选项(为一个漂亮的for循环生成名称)。 这样我避免了一堆“= false”行,并且每个表单项只有一个共享函数调用。

        

取消选中其他选项的function,以及用于保存设置的红利代码是:

 private void mnuLogging_Checked(object sender, RoutedEventArgs e) { int LogLevel = Convert.ToInt32( ((MenuItem)sender).Tag.ToString()); Properties.Settings.Default["LogLevel"] = LogLevel.ToString(); Properties.Settings.Default.Save(); // Uncheck everybody but me (as determine by "Tag") for (int i=0; i < 4; i++) { MenuItem item = Main.FindName("mnuLogging"+i) as MenuItem; if (i != LogLevel) item.IsChecked = false; } }