2014-10-31 192 views
3

我使用MS Visual 2013 Express,C#和WPF。C#WPF取消选中复选框

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

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

我在C#代码中添加了一个clickevent,一个选中和未选中的evet。我在.xaml中添加了CheckedUnchecked,但我不知道它是否能够正常工作。

希望你能帮助我:)

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

我的解决办法:

谢谢你的帮助。我尝试了一些随机提供的“IsChecked”,并让它幸运地运行。

.XAML看起来像:

  <CheckBox x:Name="CheckBox1" ... Checked="CheckBox1_Checked" /> 
      <CheckBox x:Name="CheckBox2" ... Checked="CheckBox2_Checked" /> 
      <CheckBox x:Name="CheckBox3" ... Checked="CheckBox3_Checked" /> 
      <CheckBox x:Name="CheckBox4" ... Checked="CheckBox4_Checked" /> 
      <CheckBox x:Name="CheckBox5" ... Checked="CheckBox5_Checked" /> 
      <CheckBox x:Name="CheckBox6" ... Checked="CheckBox6_Checked" /> 

C#代码CheckBox1:

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

所以最后,这是一件非常容易的事情。

+8

听起来像一个'RadioButton'给我。为什么不使用它;你会得到这个免费的行为! – BradleyDotNET 2014-10-31 19:08:34

+0

@StefanS:澄清,这是其中只有*一些*选项是互斥的情况之一吗?如果它们是* all *互斥,那么肯定使用RadioButton,就像BradleyDotNET所建议的那样。但如果只有某些是互斥的,那么Blam的建议可能就是你需要的。 – 2014-10-31 19:17:42

+0

CheckBox2.IsChecked = false;看起来很像我的答案。你知道要检查一个答案。 – Paparazzi 2014-11-01 12:53:46

回答

5
checkbox1.IsChecked = false; 

ToggleButton.IsChecked Property

我读它作为一个特殊的。如果你想拥有只是一次一个检查单选按钮,然后会做的是取消选中其他5

默认情况下,您不能取消选中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 "); 
    } 
} 
+0

这里伤害的部分是你必须对所有其他复选框执行此操作。要获得“RadioButton”行为,你可以使用http://stackoverflow.com/questions/397556/how-to-bind-radiobuttons-to-an-enum中使用的绑定过程,它会好很多。 – BradleyDotNET 2014-10-31 19:20:59

+0

@BradleyDotNET是的,我对我写的解决方案感到诡异和肮脏,但我想不出一种更简单的方法来在XAML之外做到这一点。也许我会用DataTriggers添加一些东西? – furkle 2014-10-31 19:22:25

+0

@furkle你不需要数据触发器;只需将它们全部绑定到相同的值,并使用“ValueEqualsConverter”对单选按钮非常有用,而对于“CheckBox”则会以相同的方式工作。 – BradleyDotNET 2014-10-31 19:24:13

2

BradleyDotNET是正确的 - 有一组取消选中其余的人在任何给定的复选框本质上是一个单选按钮的功能,你不结束需要做任何事情来实现这种行为。

但是,如果您真的想要使用CheckBoxes,您可以实现的一种方法是继续引用ViewModel中您的TwoWay绑定的属性中的每个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<bool?> yourCheckStates = new List<bool> { checkBox1IsChecked, ... }; 

你可以使用这样的东西,每次在其中一人的状态变化:

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

然后设置只是得到了一个价值改为true。每选中一个复选框,其他五个将始终未选中。

编辑:如果我看错这一点,因为布拉姆是在暗示,你意味着一个复选框特别取消选中所有其它的,则仅包括属性中的呼叫UncheckAllCheckBoxes()该特定CheckBox的器isChecked值,并添加一行来将所有其他设置器中的一个特殊CheckBox的IsChecked设置为false。

+0

我不是那样读的。我没有阅读任何一个。 “其他5应该不加选择” – Paparazzi 2014-10-31 19:18:22

+0

@Blam我已经添加了一个部分来说明这种可能性 – furkle 2014-10-31 19:33:12

1

你可以去这两种方法之一:

  1. RadioButton个组
  2. Selector与定制ItemTemplate

单选按钮:

<RadioButton GroupName="MyGrouping" Content="Option 1" IsChecked="True"/> 
<RadioButton GroupName="MyGrouping" Content="Option 2" /> 
<RadioButton GroupName="MyGrouping" Content="Option 3" /> 

选择:

<ListBox ItemsSource="{Binding Path=MyOptions}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <RadioButton Content="{Binding}" 
      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" /> 
    </DataTemplate> 
    </Listbox.ItemTemplate> 
</ListBox> 

注:我选择ListBox作为一个例子,但你可以选择任何来自Selector派生。

+0

你能解释一下你的绑定在那里做什么吗?我觉得我错过了一步。 – furkle 2014-10-31 19:26:13

+0

@furkle:具体绑定哪个? – 2014-10-31 21:35:36

+0

啊,我现在看到 - RadioButton正在查询包含它的ListBoxItem。花了我一秒钟的时间来围绕它。感谢您的检查。 – furkle 2014-10-31 21:39:43

0
{ 
    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"; 
    } 
}