c# - WPF 多复选框选中/取消选中

标签 c# wpf xaml

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

最佳答案

我的 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;

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

关于c# - WPF 多复选框选中/取消选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117251/

相关文章:

c# - 读取 JavaScript 文件并通过 HttpHandler 将其输出回来

C# 使用 HTML Agility Pack 解析隐藏字段

c# - XAML 文件中的不同基类

c# - DataGrid SortDirection 被忽略

c# - 哪个控件可以构建一个十六进制编辑器?

c# - 如何在单个网站中运行多个 Blazor 应用程序

c# - 类似现场的事件和匿名代表

C# 应用程序 - 如何在 xaml 表单中显示网站?

c# - 如何在 .NET 中显示负号?

c# - 查找用户控件的实际宽度