问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

WPF的TreeView控件的复选框,需要实现的效果为:选中复选框就勾选,点中 ...

发布网友 发布时间:2022-05-06 22:32

我来回答

2个回答

懂视网 时间:2022-04-27 13:11

本文将说明如何创建一个带全选复选框的列表控件。其效果如下图:


这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成。它的操作逻辑:

  • 当选中“全选”时,列表中所有的项目都会被选中;反之,取消选中“全选”时,所有项都会被取消勾选。
  • 在列表中选中部分数据项目时,“全选”框会呈现不确定状态(Indetermine)。
  • 由此看出,“全选”复选框与列表项中的复选框达到了双向控制的效果。

    其设计思路:首先,创建自定义控件(CheckListView),在其 ControlTemplate 中定义 CheckBox 和 ListView,并为 ListView 设置 ItemTemplate,在其中增加 CheckBox 控件,如下:

    <ControlTemplate TargetType="{x:Type control:CheckListView}">
      <Grid Background="{TemplateBinding Background}">
      <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
      </Grid.RowDefinitions>
      
      <CheckBox Content="全选" />  
      
      <ListView x:Name="list"
       Grid.Row="1">
      <ListView.ItemTemplate>
      <DataTemplate>
       <CheckBox />   
      </DataTemplate>
      </ListView.ItemTemplate>
      </ListView>
      </Grid>
     </ControlTemplate>

    其次,为控件添加两个依赖属性,其中一个为 ItemsSource,即该控件所要接收的数据源,也即选择列表;本质上,这个数据源会指定给其内的 ListView。另外也需要一个属性 IsSelectAllChecked 表示是否选中全选复选框。

    public static readonly DependencyProperty IsSelectAllCheckedProperty =
     DependencyProperty.Register("IsSelectAllChecked", typeof(bool?), typeof(CheckListView), new PropertyMetadata(false));
    
     public static readonly DependencyProperty ItemsSourceProperty =
     DependencyProperty.Register("ItemsSource", typeof(object), typeof(CheckListView), new PropertyMetadata(null));
    
     /// <summary>
     /// 返回或设置全选复选框的选中状态
     /// </summary>
     public bool? IsSelectAllChecked
     {
     get { return (bool?)GetValue(IsSelectAllCheckedProperty); }
     set { SetValue(IsSelectAllCheckedProperty, value); }
     }
    
     /// <summary>
     /// 数据源
     /// </summary>
     public object ItemsSource
     {
     get { return (object)GetValue(ItemsSourceProperty); }
     set { SetValue(ItemsSourceProperty, value); }
     } 
    

    需要注意的一点是,作为一个自定义控件,我们必须考虑它的通用性,所以为了保证能设置各式各样的数据源(如用户列表、物品列表或 XX名称列表),在这里定义一个数据接口,只要数据源中的数据项实现该接口,即可达到通用的效果。该接口定义如下:

    public interface ICheckItem
     {
     /// <summary>
     /// 当前项是否选中
     /// </summary>
     bool IsSelected { get; set; }
    
     /// <summary>
     /// 名称
     /// </summary>
     string Name { get; set; }
     }
    
    

    最后,我们把刚才定的属性绑定的控件上,如下:

    <CheckBox Content="全选" IsChecked="{Binding IsSelectAllChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
     <ListView x:Name="list" Grid.Row="1" ItemsSource="{TemplateBinding ItemsSource}">
     <ListView.ItemTemplate>
     <DataTemplate>
     <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}" />
      </DataTemplate>
     </ListView.ItemTemplate>
    </ListView>
    

    接下来,实现具体操作:

    首先,通过“全选”复选框来控制所有列表项:这里通过其 Click 事件来执行 CheckAllItems 方法, 在此方法中,会对数据源进行遍历,将其 IsSelected 属性设置为 True 或 False。代码如下:

    <CheckBox Content="全选" IsChecked="{Binding IsSelectAllChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
     <i:Interaction.Triggers>
     <i:EventTrigger EventName="Click">
      <ei:CallMethodAction MethodName="CheckAllItems" TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
      </i:EventTrigger>
     </i:Interaction.Triggers>
     </CheckBox>
    
    /// <summary>
    /// 全选或清空所用选择
    /// </summary>
     public void CheckAllItems()
     {
     foreach (ICheckItem item in ItemsSource as IList<ICheckItem>)
     {
     item.IsSelected = IsSelectAllChecked.HasValue ? IsSelectAllChecked.Value : false;
     }
     }
    

    然后,通过选中或取消选中列表项时,更新“全选”复选框的状态:在 DataTemplate 中,我们也为 CheckBox 的 Click 事件设置了要触发的方法 UpdateSelectAllState,代码如下:

    <DataTemplate>
     <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}">
     <i:Interaction.Triggers>
     <i:EventTrigger EventName="Click">
     <ei:CallMethodAction MethodName="UpdateSelectAllState" TargetObject="{Binding RelativeSource={RelativeSource AncestorType=control:CheckListView}}" />
     </i:EventTrigger>
     </i:Interaction.Triggers>
     </CheckBox>
    </DataTemplate>
    /// <summary>
    /// 根据当前选择的个数来更新全选框的状态
    /// </summary>
     public void UpdateSelectAllState()
     {
     var items = ItemsSource as IList<ICheckItem>;
     if (items == null)
     {
     return;
     }
    
     // 获取列表项中 IsSelected 值为 True 的个数,并通过该值来确定 IsSelectAllChecked 的值
     int count = items.Where(item => item.IsSelected).Count();
     if (count == items.Count)
     {
     IsSelectAllChecked = true;
     }
     else if (count == 0)
     {
     IsSelectAllChecked = false;
     }
     else
     { 
     IsSelectAllChecked = null;
     }
     }
    
    
    

    这里也有两点需要提醒:

    我一开始定义属性 IsSelectAllChecked 时,它的类型是 bool 类型,那么,由于 CheckBox 控件的 IsChecked 值为 null 时,它将呈现 Indetermine 状态,所以后来把它改为 bool? 类型。

    在XAML 代码中可以看出,对事件以及事件的响应使用了行为,所以,需要添加引用 System.Windows.Interactivity.dll 和 Microsoft.Expression.Interactions.dll 两个库,并在XMAL 头部添加如下命名空间的引用:

    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    
    

    这样,这个控件就基本完成了,接下来是如何使用它。

    首先,定义将要在列表中展示的数据项,并为它实现之前提到的 ICheckItem 接口,这里定义了一个 User 类,如下:

    public class User : BindableBase, ICheckItem
     {
     private bool isSelected;
     private string name;
    
     public bool IsSelected
     {
     get { return isSelected; }
     set { SetProperty(ref isSelected, value); }
     }
    
     public string Name
     {
     get { return name; }
     set { SetProperty(ref name, value); }
     }
     }
    
    

    接下来在 ViewModel 中定义一个列表 List<ICheckItem>,并添加数据,最后在 UI 上为其绑定 ItemsSource 属性即可,在此不再贴代码了,具体请参考源代码。

    源码下载

    热心网友 时间:2022-04-27 10:19

    在<TreeView.ItemTemplate>中添加一个checkbox,content不要填内容,另外弄个label显示类容这样就可以了啊
    WPF的TreeView控件的复选框,需要实现的效果为:选中复选框就勾选,点中 ...

    在&lt;TreeView.ItemTemplate&gt;中添加一个checkbox,content不要填内容,另外弄个label显示类容这样就可以了啊

    在WPF TreeView中使用Checkbox

    虽然 WPF TreeView 控件本身不提供显示复选框的内在支持,但我们可以通过绑定表达式和属性来实现。每个 TreeViewItem 都包含一个 TreeView,通过向其属性添加表达式,我们可以将复选框的检查状态绑定到底层数据对象的属性。WPF 的数据绑定功能使得这一过程变得简单。以下是演示应用程序的屏幕截图:接下来,我...

    vba treeview选中节点 同时勾选复选框

    果勾选所有子节点,父节点也会勾选;如果某子节点取消勾选,则所有父节点也取消勾选”,下面的代码能全做到://设置标志,防止死循环 bool check = false;//节点勾选后事件,如果更改某一节点状态会自动触发,所以在后面的方法中无需递归 private void treeView1_AfterCheck(object sender, TreeViewE...

    c#的treeview复选框怎么使用

    首先将treeView的CheckBoxess属性设置为true,那么treeView的每个节点旁就会多个复选框。如果你要选择某一个节点,比如选择“节点0”,代码可以这样写:this.treeView1.Nodes[0].Checked = true;如果你要获取treeView那些节点被勾中,则需要遍历如:foreach (TreeNode tn in this.treeView1.Nodes) ...

    如何在C#Winform窗体的Treeview上面添加CheckBox复选框

    WinForm的TreeView控件和ASP.NET的有一些区别,你设置控件的CheckBoxes属性为true就可以在所有节点上显示复选框了。还有疑问请追问或是Hi

    js怎么实现复选框树形菜单勾选父节点,子节点全部勾选。子节点勾选,父...

    思路就是:找出父节点的所有子节点的checked的属性设置成与父节点一致即可 我是利用jquery实现,看看是否符合你的要求 (function(){ ("#tree").treeview();("input[name='ids']").click(function(){ var checkedValue = this.checked;(this).parent("li").find("input[name='ids']").at...

    C#TreeList带复选框怎么获取已经勾选的值 求大神指教

    您好,treeview子节点勾选部分, 父节点checkbox为半透明勾选 就好像CheckBox.CheckState = Indeterminate时的状态再加上一个小勾。private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){ string str = e.Node.Text;} ...

    WPF中TreeView如何实现展开一个节点其他节点关闭?

    第一种,运用TreeView的SelectedItemChanged事件 假设TreeView控件的name是treeview c#参考代码:private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e){ TreeViewItem selected_item = treeview.SelectedItem as TreeViewItem;TreeViewItem item;if (selected_item != nu...

    C# windowform下的 treeview ,两层结构,需要子节点显示复选框,父节点...

    把父节点挂到树上,再生成子结点,把子结点挂到父节点上这么做的话,很简单,在生成节点的同时就可以分别设置节点是否应显示复选框 如果以上办法行不通,你还可以这样:在树生成以后,再遍历一下所有节点,根据节点的Level来确定节点是否应该显示复选框,多一个步骤而己 希望对你有帮助 ...

    vb.net中TreeView控件的使用

    TreeView控件的每个节点(Node对象)包含了一个标签和可选的点位图 每个节点又可能包含有若干个的子节点 可以通过控制某个节点来展开显示或者折叠隐藏它所包含的子节点 一 TreeView 控件的一些常用属性 CheckBoxes 属性 指示是否在树视图控件中的树节点旁显示复选框 FullRowSelect 属性 当 FullRowSelect 为 ...

    声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
    E-MAIL:11247931@qq.com
    大连公积金中山办事处在什么地方? 我是汕头市潮南区陇田镇东波村现住有线电视台后面有装宽带家里没有电 ... 汕头市1953年,1964年,1982年,1990年,2000年人口出生率和人口死亡率? 陇田镇乡镇概况 汕头历年出生人口 兴陇社区广东省汕头市潮南区陇田镇兴陇社区 田二社区广东省汕头市潮南区陇田镇田二社区 牙签遇到洗洁精的原理 多西他赛成分 横山智佐参与作品 WPF怎样树节点把树节点设置为多选,以及怎么取值 i53470和e52660哪个好? 汇聚尚品摄像头怎么样 为什么江苏省连云港市海宁大道没有坏而把它扒掉重铺,而江化北路10几年了,都不成样子了 却不修,不明白 想知道: 中国 从鄂州市到当阳市有多少公里 在哪 大安区的历史 村里什么时候改选选 刘振娟是徐国元给安排的工作吗 松山区区长张国华老家在哪 能根据脸型设计发型的软件 邹德华的人物简介 王玉良的人物简历 李学玉的个人经历 夏国华的个人经历 最近怎么难以找到国外翻译过来的小说了 泰安银行标志是什么字体 为什么有些人在百度上提问的乱七八糟的,也没有人管一下。 泰安标志设计哪家好 华为手机老年人用的? 泰安标志设计 C#中treeview在 页面中怎么实现多选并且取值 winform treeview checkbox多选,点击按钮把选中的值传给listbox控件 C# treeview多选 查询数据库 wpf 中treeview控件如何获取选中的对象 新手学习wpf的treeview!选择一个路径,如何获取该路径下所有特定类型的文件,并将他们绑定在treeview的中 求教:c# wpf treeView如何知道怎么选中了哪个子树? WPF MVVM模式下 TreeView 怎么只展开一个节点.其余节点关闭 WPF自定义TreeView显示结构通用类 系统是win10,前段时间改了计算机名 儿童换牙时 ,腮牙也换吗? 儿童换牙 儿童多次换牙 小孩换牙了,可乳牙还没掉,旁边就长出新 牙还歪着 怎么办? 过年父母给孩子多少压岁钱 我要做的的一颗牙,我难受,你也会心疼?这句子的意思 小狮子爱尔莎 1、文章讲了“我”和爱尔莎之间发生的那些事? 2、从哪里看出我喜欢爱尔莎?(写句子) 过年给外甥女多少压岁钱呢? 怎样下载手机听书吧 评书吧 评书 评书下载 哪里下载评书包,一包全集不要钱的?
    • 焦点

    最新推荐

    猜你喜欢

    热门推荐