wpf - 如何在 WPF 中设置/重置三态复选框值

标签 wpf wpf-controls checkbox wpfdatagrid

我有一个数据网格,其标题列之一是三态复选框。该列的单元格模板包含两个状态复选框
+ 所有项目复选框
- 项目 1
- 项目2
- 项目 3
..
我想使用 AllItems 复选框来选择/取消选择所有工作正常的项目(item1,item2)。接下来,当并非所有项目都被选中/取消选中时,我想将 AllItems 复选框设置为中间状态。同样,当手动选择所有项目时,我想将 AllItems 复选框设置为选中/未选中。

这是我尝试过的代码...

<dg:DataGridTemplateColumn.HeaderTemplate>
    <DataTemplate>
        <StackPanel x:Name="StackPanelForItemCheckbox" Orientation="Horizontal">
           <CheckBox x:Name="AllItemSelectionCheckBox" HorizontalAlignment="Left" Cursor="Hand"  
                     IsChecked="{Binding IsAllItemChecked, Mode=TwoWay}"                                              
                     IsThreeState="True"  Checked="ItemSelectionCheckBox_Checked" 
                     Unchecked="ItemSelectionCheckBox_Unchecked"
                     Click="AllItemSelectionCheckBox_Click">
           <TextBlock x:Name="ItemNameTextBlock" Text="Item" Margin="10,0,0,0">
           ......
<dg:DataGridTemplateColumn.CellTemplate>
       <DataTemplate x:Name="ItemCheckDataTemplate">                                
           <StackPanel x:Name="ItemCheckBoxStackPanel" Orientation="Horizontal">                                    
                  <CheckBox x:Name="itemCheckBox" Cursor="Hand" IsChecked="{Binding IsItemChecked, Mode=TwoWay}" Click="ItemSelectionCheckBox_Click"></CheckBox>
                   <TextBlock x:Name="ItemNameTextBlock" Text="{Binding Path=Item}"> </TextBlock>                                   
            </StackPanel>
         </DataTemplate>
...

“ItemSelectionCheckBox_Click”方法查找所有三种状态(全部选中、未选中、中间)并设置“IsAllItemChecked”属性,即 INotifyproperty。这没用。我可能会尝试的其他替代方法是找到“AllItems”元素并从代码中设置它。在网上找不到类似的东西。例子很少,但适用于 TreeView 而不是我尝试的方式。有什么帮助吗?

PS>>

更新了修复以关闭此帖子。
  • 我想要的第一件事是允许“AllItemSelectionCheckBox”在手动选择时只有两种状态(True、False)。
    private void AllItemSelectionCheckBox_Click(object sender, RoutedEventArgs e)
    {
        var cb = e.Source as CheckBox;
        if (!cb.IsChecked.HasValue)
            cb.IsChecked = false;  
    }
    
  • 我想要“AllItemSelectionCheckBox”复选框来显示三态直通代码。
  • 所有选中的复选框都将导致其值为 TRUE
  • 所有未选中的复选框将导致其值为 FALSE
  • 任何少数选择将导致其值为 NULL。

  • 代码示例如下:
    private void itemCheckBox_Checked(object sender, RoutedEventArgs e)
    { 
        DataGridRowsPresenter DGRPresenter = FindVisualChild<DataGridRowsPresenter>(DataGName1);
        if (DGRP == null || DGRP.Children == null)
            return null;
        foreach (object obj in UIEC)
        {
            DGR = obj as Microsoft.Windows.Controls.DataGridRow;
            UIC = DGR.Item as <datagrid mapped data model>;
            if (DGR.IsSelected == true)
                UIC.IsItemChecked = true;
            if (UIC.IsItemChecked == true)
                    NumberOfItemsChecked++;
        }
        if (NumberOfItemsChecked == myViewModelAllItems.Count)
        {
            allcheckbox.IsChecked = true;
        }
        else if (NumberOfItemsChecked < myViewModelAllItems.Count)
        {
            allcheckbox.IsChecked = null;   //intermittent state
        }
    }
    

    由于竞争条件破坏了外部值,全局更新 NumberOfItemsChecked 计数不起作用。

    注意:上面的代码更像是一个示例,直接复制可能无法正常工作。我可以根据要求提供带有示例的完整代码。

    最佳答案

    对于想要实现这一目标的人

  • 用户只能将 View 中的复选框切换为真或假。不要未定义!
  • ViewModel 中的代码可以将复选框切换为 true 或 false 或未定义

  • 这样做:
  • 添加复选框以查看但 不要设置 IsThreeState=true
  • 绑定(bind) IsCheckedbool? ViewModel 中的 (nullable bool) 属性

  • 您现在可以将其设置为 null在 ViewModel 中,而用户无法在 View 中执行此操作。

    关于wpf - 如何在 WPF 中设置/重置三态复选框值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4778230/

    相关文章:

    html - 使用 Perl CGI 的复选框

    .net - WPF 数据网格样式

    WPF和3D创建碗效果

    c# - 添加到 WPF Canvas 的图像更改大小

    wpf - 将相同类型的 View 模型列表绑定(bind)到 Caliburn.Micro 中的选项卡控件

    jquery - 获取从复选框到 div 的状态

    java - 在偏好 Activity 中静音

    wpf - 扩展 WPF 工具包 - 调整子窗口的大小

    .net - 如何可靠地确定 WPF 应用程序中是否正在使用 `ControlTemplate`?

    c# - WPF:ComboBox F4 键未在 KeyDown 事件中触发