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

2023-12-23

我有一个数据网格,其标题列之一是三态复选框。该列的单元格模板包含两个状态复选框 + 所有项目复选框 - 项目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 计数不起作用。

Note:上面的代码更像是一个示例,直接复制它可能不起作用。我可以根据要求提供完整的代码和示例。


事实上我还有一个更好的。

我发现,如果我为 IsThreeState 创建一个绑定,然后根据该值是否设置来更改该值,那么它就可以工作。

bool? _Value;
public bool? Value
{
    get { return _Value; }
    set
    {
        if (value == null)
        {
            IsThreeState = true;
        }
        else
        {
            IsThreeState = false;
        }
        _Value = value;

        NotifyPropertyChanged("Value");
    }
}

bool _IsThreeState = true;
public bool IsThreeState
{
    get { return _IsThreeState; }
    private set
    {
        _IsThreeState = value;
        NotifyPropertyChanged("IsThreeState");
    }
}

现在复选框将支持外部将值设置为 null 的状态。 如果该值为 true 或 false,用户将无法将其设置为 null。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WPF 中设置/重置三态复选框值 的相关文章

  • 消息框按钮文本

    我环顾四周 似乎所有内容都可以在消息框中编辑 禁止按钮上的文本 WPF http en wikipedia org wiki Windows Presentation Foundation C MessageBox Show Generic
  • Drupal 视图 - 自定义/修改 SQL

    我遇到了 配置文件复选框 模块的问题 该模块存储以逗号分隔的自定义配置文件字段 问题是我是否创建一个视图来按值过滤 SQL 结果最终是这样的 AND profile values profile interests value in Bus
  • 在 MVVM 中设置可见性的最佳方法

    In my View我有三个对象 其中一个在任何给定时间都是可见的 在我的Model我有一个枚举来代表这三个状态 我应该如何实施我的ViewModel a 为每个对象的可见性创建一个布尔值 并将每个对象绑定到该布尔值 使用 bool gt
  • 树视图上下文菜单命令未触发

    我有一个绑定到某些属性类型的 Observable 集合的树视图 有一个 HierarchicalDataTemplate 在树视图中显示数据 现在我需要显示每个 HierarchicalDataTemplate 项目的特定上下文菜单 我使
  • 创建面向鼠标和触摸的 WPF 应用程序的最佳实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过样式设置 DataGridCellsPresenter 的 ItemsPanel 不起作用

    我正在尝试设置ItemsPanel of a DataGridCellsPresenter在我的窗口的资源中 Bu
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 有没有基于 WPF 的 Markdown 渲染器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有基于 WPF 的应用程序 我们有单独的字符串存储库 其中的文本在网络中进行编辑 在我们的 WPF
  • 如何使用 WPF 从 XML 文件创建树视图?

    这是 XML 文件
  • 不支持 URI 前缀

    我正在尝试使用以下方法加载和播放波形文件 SoundPlayer simpleSound new SoundPlayer pack application MyAssembly component Sounds 10meters wav s
  • 获取 TreeView 中子节点的 SelectedIndex

    我目前正在使用 C 开发一个 wpf 项目 我创建了一个树视图 其中包含父节点和子节点 我想知道是否有办法获取用户单击的子节点的索引 类似于使用组合框时的 SelectedIndex 我尝试过各种方法 例如 int val TreeView
  • 如何从WPF中的另一个窗口调用方法

    我有两个窗户win1用于显示用户列表和其他win2用于添加用户 我还有一种在删除 更新或添加用户后刷新网格的方法 这个方法是在win1 我如何调用这个方法win2添加用户后 这是一个非常基本的面向对象设计问题 所以您希望能够从win2到一个
  • 如何将 WPF UIElement 从可视化树移动到固定页面?

    我的 MVVM 应用程序使用屏幕上的视觉对象将屏幕内容渲染到打印文档 我的视图有一个ContentControl使用DataTemplate资源来确定要显示的内容 但是当我尝试将该内容添加到FixedPage对象 我得到一个Argument
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 增加 WPF 弹出动画的持续时间

    我有一个 WPF PopUp 控件 用于显示菜单叠加层 并且使用默认的淡入淡出动画 不过我想让动画需要更长的时间才能完成 我可以在 XAML 中做到这一点吗 你能在这里发布相关的xaml代码吗 否则 您可以查看这些链接以开始使用 xaml
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • 在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?

    我想使用 xaml 中的 Visual Studio Designer 设计一个现代外观的 UI 它为我提供了一个很好的工具箱 我可以使用它通过拖放来直观地创建 UI 由于它几乎表现得像 HTML 我想知道它是否也有丰富的主题库 我找到了一

随机推荐

  • TortoiseSVN不保存密码

    我在 Windows 7 Professional 64 位中安装了 Tortoisesvn 1 8 7 乌龟总是要求保存密码 但还是不保存 我多次清除路径 AppData Roaming Subversion 但没有在 svn simpl
  • 禁用 Ruby on Rails 中的文本框?

    我有代码 我想禁用使用嵌入式 ruby 的文本框 但无法这样做 如果我能就我所面临的情况获得任何帮助 我将不胜感激 禁用文本框后 我想让一个按钮从数据库表 项目符号 生成四个随机 ID 并将它们以数组格式打印在禁用的文本框中 并利用这四个打
  • 编辑电子邮件地址后无法登录

    I have 格里特 v3 0 0在我的服务器上运行 昨天一切正常 这是我的身份验证方法 auth type http emailFormat 0 domain com 我不确定这是否是问题的原因 但我可能已删除我的电子邮件地址 电子邮件受
  • 将列值从一个数据库.表复制到另一个数据库.表

    让我们保持简短而甜蜜 我想这样做 我现在已经失败了很多次 一次尝试甚至用空白更新了行 UPDATE Database2 Table1 SET Database2 Table1 Column1 Database2 Table1 Column2
  • Node Express 强制所有静态路由指向根路径

    我有一个 node js 应用程序 我正在尝试对其进行通用化 以便无论后端的 URL 是什么 它始终使用根路径来提供静态文件 所以目前我的应用程序位于https myapp heroku com https myapp heroku com
  • 如何在 twitter-bootstrap 中停止图像响应?

    我正在使用 twitter bootstrap 来制作响应式布局 它的效果非常棒 它使图像过于敏感 我需要一些图像只需要固定宽度和高度 div class span1 img src http i ytimg com vi uGBKzIY4
  • 在asp.net MVC中,我们可以从另一个控制器调用一个控制器的方法吗?

    在asp net MVC中 我们可以从另一个控制器调用一个控制器的方法吗 您也可以直接重定向到该方法 如下所示 public class ThisController public ActionResult Index return Red
  • 如果 using 块返回,IDisposable 是否会被释放?

    例如 using var something GetSomething something DoSomething if something IsX return true return false 是的 一点没错 这Dispose方法被调
  • C# - 如何将转义字符串转换为文字字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 我可以在运行时展开包含 C 文字表达式的字符串吗 https stackoverflow com questions 3298075 can i expand a string that contai
  • 有没有办法在 C++ 中传递字符串文字作为引用

    在 C 中 如果值不能为 NULL 则通常通过引用而不是指针传递 假设我有一个具有以下签名的函数 该函数通常与字符串文字一起使用 void setText const char text 我想知道如何更改函数以使其接受引用 并且具有不接受
  • Java中的paintComponent()没有被调用[重复]

    这个问题在这里已经有答案了 我正在尝试绘制一个简单的矩形 但我认为 PaintComponent 方法没有被调用 这是带有 main 方法的类的代码 package painting import java awt import javax
  • 电子,在browserify之后,fs.existsSync不是一个函数

    我读了很多关于 browserify 和 electro 以及 gui 浏览器问题 但 browserify 仍然存在问题 说 fs existsSync 不是一个函数 并且 required 未定义 完整的故事 我用电子创建了简单的图形用
  • 关于静态方法的 Java 编码约定

    这是一个非常简单的问题 但我认为这是一个有点争议的问题 当我编写 Java 类代码时 我使用以下顺序 class Foo static fields instance fields constructors methods non stat
  • 使用JDK的JAXB,不带ns2前缀

    在阅读了 Oracle 论坛 Stackoverflow java net 上有关此内容的所有帖子后 我终于在这里发帖了 我正在使用 JAXB 创建 XML 文件 但问题是它添加了著名的ns2在我的元素之前添加前缀 我已经尝试了所有没有人为
  • C++ 中的命令模式序列化

    我想在 C 中执行以下操作 创建命令对象 序列化它 发送到另一台电脑 反序列化 execute 两种情况 发送者和接收者都是win 7 电脑 发送者是 nix 接收者是 win 7 我找到了一个序列化教程 http www function
  • php date_diff 以小时为单位

    如何使下面的代码将天数转换为小时数 timestart date create 02 11 2011 row gt timestart row gt timestart returns time in 00 00 00 format tim
  • 模板实例化、两阶段名称查找、自动推导类型的不同行为

    看到这个问题后何时检查 C 模板实例化类型 https stackoverflow com q 34204483 2805305 并且很长一段时间以来我都在想同样的事情 我开始玩代码来吸收知识 答案给出了明确且正确的解释 它提到了两阶段名称
  • 将 EF 迁移合并到新的 InitialCreate 中

    我使用 EF 迁移已经有一段时间了 我的项目中有超过 100 个迁移文件 我想在继续之前将它们合并到一个迁移中 即我想用一个新版本替换现有的 InitialCreate 迁移 该版本考虑了我的所有后续更改 以便我可以删除所有其他迁移文件 如
  • iOS - 带有推送通知的聊天应用程序

    我的问题很简单 使用推送通知开发聊天应用程序是个好主意吗 因此 推送通知并不可靠 并且无法保证它们是否会到达 如果不可靠 实时聊天应用程序应该使用哪种技术 Why not 使用 iOS 推送通知构建聊天绝对是可能的 Aaron 的观点很有趣
  • 如何在 WPF 中设置/重置三态复选框值

    我有一个数据网格 其标题列之一是三态复选框 该列的单元格模板包含两个状态复选框 所有项目复选框 项目1 项目2 项目3 我想使用 AllItems 复选框来选择 取消选择所有项目 item1 item2 效果很好 接下来 当未选择 取消选择