在 C# 中单击 SelectAll 时选中所有复选框

CheckAll checkboxes when SelectAll is clicked in c#

我有一个动态列表框,如何在单击 select所有按钮时 select 列表框中的所有复选框。

Xaml :

StackPanel Width="400" Orientation="Horizontal" Grid.Row="0">
                    <!--<CheckBox IsThreeState="True" x:Name="cbAllFeatures" Width="111" Content="Select all" Height="78"/>-->
                    <AppBarButton x:Name="Btn_SelectAll" Margin="20,0,0,0" Label="Select All" Icon="SelectAll" Click="Btn_SelectAll_Click" FontWeight="Bold" />
                    <AppBarButton x:Name="Btn_Delete" Margin="100,0,0,0" Label="Delete All" Icon="Delete" Click="DeleteAll_Click" FontWeight="Bold" />
                </StackPanel>

<ListBox  x:Name="listBoxobj" ItemsSource="{Binding}" Background="Transparent" Margin="6" Height="auto" BorderThickness="2" MaxHeight="580" Grid.Row="1" SelectionChanged="listBoxobj_SelectionChanged">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid Width="330" Height="100" >
                                <Border Margin="5" BorderBrush="White" BorderThickness="1">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="Auto"/>
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="50" />
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="100" />
                                        </Grid.ColumnDefinitions>
                                        <CheckBox Name="Option1CheckBox" Grid.Row="0" Grid.Column="0"  IsChecked="{Binding Checked,Mode=TwoWay}"  VerticalAlignment="Center" Margin="5,0,0,0" />
                                        <TextBlock x:Name="NameTxt" Grid.Row="0" Grid.Column="1" TextWrapping="Wrap" Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="22" Foreground="White"/>
                                        <TextBlock x:Name="Age" Grid.Row="1" Grid.Column="1" TextWrapping="Wrap" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" FontSize="22" Text="{Binding Age}" />
                                        <Button Grid.Row="0" Grid.Column="2" x:Name="deleteTaskButton" BorderThickness="0" Margin="0"  Click="deleteTaskButton_Click" Height="18" IsEnabled="False">
                                            <Image Source="/Assets/delete.png"/>
                                        </Button>
                                    </Grid>
                                </Border>
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

我试过用这种方法做,但好像不行。

   class SelectAll : INotifyPropertyChanged
    {
        public bool _Checked = false;

        public bool Checked
        {
            get
            {
                return _Checked;
            }
            set
            {
                if (value != _Checked)
                {
                    _Checked = value;
                    NotifyPropertyChanged("Checked");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

单击 select_all 时的代码。

 public void Btn_SelectAll_Click(object sender, RoutedEventArgs e)
    {
      obj_check._Checked = true;
    }

我的想法是使用 for 循环。它必须检查每个项目。但我不知道如何检查,因为我不能 select Checkbox.Any 感谢帮助。

试试这个

首先创建这个函数:

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }

创建一个新布尔值:

bool Cheacked = false;

然后在您的按钮上添加:

        if (!Cheacked)
        {
            IEnumerable<CheckBox> _CheackBox = FindVisualChildren<CheckBox>(this);
            foreach (CheckBox _CB in _CheackBox)
            {
                _CB.IsChecked = true;
            }
        }
        else
        {
            IEnumerable<CheckBox> _CheackBox = FindVisualChildren<CheckBox>(this);
            foreach (CheckBox _CB in _CheackBox)
            {
                _CB.IsChecked = false;
            }
        }

它将获取 window 中的所有对象,然后将它们标记为已选中