wpf带checkbox的treeview开发

来源:互联网 发布:手机淘宝申请售后流程 编辑:程序博客网 时间:2024/05/22 05:08

http://blog.csdn.net/kunoy/article/details/11603933


好久没有写博文了,其实也发现没什么可写的,最近又搞起WPF来,其中用到了treeview,有点东西拿来分享一下。

  treeview默认是不带checkbox的,但让他带checkbox也很简单,设置一下样式即可,当然这不是难点,也不是重点,重点是checked属性怎么关联数据的问题,笔者也是查阅网上诸多大神的示例,其中就使用了绑带数据源的方式,实现动态改变checked状态,笔者也是在此基础上进行修改,增加了tree的级选模式,即当选中一个节点时,自动选中它的全部子节点及其父节点。效果如图:

  关于该大神的示例代码大家可以从这里去看看:http://www.cnblogs.com/zsmhhfy/archive/2013/03/18/2965755.html

  该源代码默认已经实现了选中一个节点,自动选中父节点,但不会选中该节点下面的子节点。使用model中的checked属性遍历设置是实现不了选中子节点的操作,那么笔者就在checkbox上增加一个click事件:

[csharp] view plaincopy
  1. private void treeNode_Click(object sender, RoutedEventArgs e)  
  2.         {  
  3.             TreeViewItem item = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;  
  4.             if (item != null)  
  5.             {  
  6.                 item.Focus();  
  7.                 eachCheckedNode();  
  8.                 e.Handled = true;  
  9.             }  
  10.         }  

[csharp] view plaincopy
  1. private void eachCheckedNode()  
  2.         {  
  3.             if (chktree.SelectedItem != null)  
  4.             {  
  5.                 TreeModel tree = (TreeModel)chktree.SelectedItem;  
  6.                 tree.SetChildrenChecked(tree.IsChecked);  
  7.                 tree.SetParentChecked(tree.IsChecked);  
  8.             }  
  9.         }  
  以下代码加在model中。
[csharp] view plaincopy
  1. /// <summary>  
  2.        /// 设置所有子项的选中状态  
  3.        /// </summary>  
  4.        /// <param name="isChecked"></param>  
  5.        public void SetChildrenChecked(bool isChecked)  
  6.        {  
  7.            foreach (TreeModel child in Children)  
  8.            {  
  9.                child.IsChecked = IsChecked;  
  10.                child.SetChildrenChecked(IsChecked);  
  11.            }  
  12.        }  
  13.        /// <summary>  
  14.        /// 设置所属父节点的选中状态  
  15.        /// </summary>  
  16.        /// <param name="isChecked"></param>  
  17.        public void SetParentChecked(bool isChecked)  
  18.        {  
  19.            if (Parent != null)  
  20.            {  
  21.                if (isChecked && !Parent.IsChecked)  
  22.                {  
  23.                    Parent.IsChecked = IsChecked;  
  24.                    Parent.SetParentChecked(isChecked);  
  25.                }  
  26.                else  
  27.                {  
  28.                    if (!isChecked && !Parent.getChildrenChecked())  
  29.                    {  
  30.                        Parent.IsChecked = IsChecked;  
  31.                        Parent.SetParentChecked(isChecked);  
  32.                    }  
  33.                }               
  34.            }  
  35.        }  
[csharp] view plaincopy
  1. /// <summary>  
  2.      /// 获取所有子项的选中状态  
  3.      /// </summary>  
  4.      /// <return value>true表示有选中的,false表示没有选中的</teturn>  
  5.      public bool getChildrenChecked()  
  6.      {  
  7.          bool value = false;  
  8.          foreach (TreeModel child in Children)  
  9.          {  
  10.              if (child.IsChecked)  
  11.              {  
  12.                  value = true;  
  13.                  break;  
  14.              }  
  15.          }  
  16.          return value;  
  17.      }  

  将原来代码中的checked属性中的级选操作注释,避免重复调用。

  这样,treeview就可以级选操作了。


0 0
原创粉丝点击