C# C WPF取消选中复选框

C# C WPF取消选中复选框,c#,wpf,C#,Wpf,我使用MS Visual 2013 Express、C和WPF 在我的程序中有六个复选框,当其中一个被选中时,其他五个应该被取消选中 我在谷歌上搜索了过去两个小时,但作为C语言的初学者,我找不到解决方案。在java中,我只写checkbox1.setSelectedfalse 我在C代码中添加了一个clickevent,一个选中和未选中的evet。我在.xaml中添加了Checked和Unchecked,但我不知道如何让它工作 希望你能帮助我: ======================= 我

我使用MS Visual 2013 Express、C和WPF

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

我在谷歌上搜索了过去两个小时,但作为C语言的初学者,我找不到解决方案。在java中,我只写checkbox1.setSelectedfalse

我在C代码中添加了一个clickevent,一个选中和未选中的evet。我在.xaml中添加了Checked和Unchecked,但我不知道如何让它工作

希望你能帮助我:

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

我的解决方案:

谢谢你的帮助。我用你建议的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"  />
e、 g.对于复选框2:

    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;
我把它看作是一个特殊的,不勾选其他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 ");
   }
}

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

但是,如果您真的想使用复选框,可以实现的一种方法是在ViewModel中双向绑定的属性中保留对每个复选框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, ... };
然后将刚刚更改的值设置为true。每次选中一个复选框时,其他五个复选框将始终处于未选中状态


编辑:如果我误解了这一点,正如布拉姆所建议的,您的意思是一个复选框特别取消选中所有其他复选框,那么只在属性中包含对该复选框的IsChecked值的取消选中复选框的调用,并添加一行,将所有其他设置程序中的一个特殊复选框设置为false。

您可以使用以下两种方法之一:

组中的单选按钮 具有自定义ItemTemplate的选择器 单选按钮:

选择器:


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

您可能会发现这很有用。我有一个日志级别的wpf菜单,一次只想激活一个选项,即选中时取消选中所有其他菜单项。 我的技巧是使用FindName方法和xaml中的tag选项为nice for循环生成名称。这样我就避免了一堆=false行,并且每个表单项都只有一个共享函数调用

<MenuItem Header="Logging">
  <!-- let's use the cool TAG propery to store the debugLevel code. We don't use it, but the idea is cool -->
  <MenuItem Tag="0" Name="mnuLogging0" Header="None" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="1" Name="mnuLogging1" Header="Normal" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="2" Name="mnuLogging2" Header="Debug Level 1" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="3" Name="mnuLogging3" Header="Debug Level 2" IsCheckable="True" Checked="mnuLogging_Checked"   />
</MenuItem>
取消选中其他选项的功能以及保存设置的奖金代码为:

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

对我来说,听起来像个无线电按钮。为什么不改用它呢;你可以免费获得这种行为@StefanS:澄清一下,这是一个只有一些选项是相互排斥的场景吗?如果它们都是相互排斥的,那么一定要使用单选按钮,就像BradleyDotNET建议的那样。但如果只有某些是相互排斥的,那么布拉姆的建议可能就是你所需要的;看起来很像我的答案。你知道检查答案。我不是那样读的。我没有把一本当作一本书来读。其他5个应该得到unchecked@Blam我已经添加了一个部分来说明这种可能性。这里的问题是,你必须对所有其他复选框都这样做。要获得RadioButton行为,您可以使用中使用的相同绑定过程,这会好得多。@BradleyDotNET是的,我对我编写的解决方案感到奇怪和肮脏,但我想不出在XAML之外更简单的方法。也许我会添加一些数据触发器?@furkle你不需要数据触发器;只需将它们都绑定到相同的值,并使用ValueEqualsConverter,这对单选按钮非常有用,对复选框也同样有效。@BradleyDotNET不,如果您按照措辞接受问题也不会更好。当其中一个被选中时,其他五个应该被取消选中。不是什么时候,也不是什么时候。如果有,那么就不可能检查其他5对我。@是的,但是你怎么知道之前检查过其他哪一个?你能解释一下你的绑定在那里做什么吗?我觉得我遗漏了一个步骤。@furkle:具体是哪个绑定?啊,我现在明白了-RadioButton正在查询包含它的ListBoxItem。我花了一秒钟的时间才把头绕过去。谢谢你的检查。
<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>
 {
    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";
    }
}
<MenuItem Header="Logging">
  <!-- let's use the cool TAG propery to store the debugLevel code. We don't use it, but the idea is cool -->
  <MenuItem Tag="0" Name="mnuLogging0" Header="None" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="1" Name="mnuLogging1" Header="Normal" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="2" Name="mnuLogging2" Header="Debug Level 1" IsCheckable="True" Checked="mnuLogging_Checked"  />
  <MenuItem Tag="3" Name="mnuLogging3" Header="Debug Level 2" IsCheckable="True" Checked="mnuLogging_Checked"   />
</MenuItem>
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;
  }
}