在 c# 中单击 SelectAll 时的 CheckAll 复选框

Posted

技术标签:

【中文标题】在 c# 中单击 SelectAll 时的 CheckAll 复选框【英文标题】:CheckAll checkboxes when SelectAll is clicked in c# 【发布时间】:2018-01-15 19:35:49 【问题描述】:

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

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 循环。它必须检查每个项目。但我不知道如何检查,因为我无法选择复选框。感谢任何帮助。

【问题讨论】:

【参考方案1】:

试试这个

首先创建这个函数:

    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;
            
        

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

【讨论】:

我收到错误“窗口是一种类型,在给定的上下文中无效” @Rachel 您需要将 Window 更改为您的窗口的名称 @Rachel Windows 在哪里放这个

以上是关于在 c# 中单击 SelectAll 时的 CheckAll 复选框的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中临时更改按钮单击时的按钮颜色

打开选择器时的 C# WPF DatePicker 值

WPF XAML DataGrid 和 SelectAll

我们如何在 SwiftUi 的另一个视图中传递布尔状态

在 iOS 中单击按钮时的标签和框架扩展

需要使用 C# 刷新 chrome 浏览器