现在已经实现了treeview的数据绑定 通过控件模板  在xaml文件中进行绑定的  后台就是一个给控件赋数据库的句子
比如 ItemsSource = xxx (数据源是一个实体 List<xxxx>)
但是因为给treeview加上了checkbox控件  所以不知道该怎么实现联动,并且能保证复选框的三态在网上看到有给实体加上依赖属性,或者是实体继承INotifyPropertyChanged接口   但还是感觉无从下手
请高人指点   谢谢了  最好能提供详细的思路 或者代码片段

解决方案 »

  1.   

    顶下  回2楼 如果处理事件会很麻烦的    网上有看到ViewModel模式的   不过不太懂它的原理
      

  2.   

    就是说想实现,带复选框3种状态的treeview,是吧?
      

  3.   

    是web还是winform啊winform中我是自己写方法做的 用递归实现子节点全选中的 
      

  4.   

    网上有看到过递归实现的 但是我的TreeViewItem中有其他的控件 而且递归会把所有的control都显示出来 效率不怎么高诶
    我是wpf 不是winform  这2个是有区别的
      

  5.   

    好难。用ViewModel能实现,看不大懂。
      

  6.   

    不懂什么是WPF,不过有递归的代码
      private void bindTree()
            {
                SqlConnection con = new SqlConnection("server=.;database=DBzealot;integrated security=SSPI;");
                SqlCommand cmb = new SqlCommand("select *from treeTest", con);
                SqlDataReader reader;
                con.Open();
                reader = cmb.ExecuteReader();
                ListTree = new List<classTree>();
                while (reader.Read())
                {
                    classTree csTree = new classTree();
                    csTree.ID = (int)reader["nodeID"];
                    csTree.Name = (string)reader["nodeName"];
                    if (reader["parentNodeID"] != DBNull.Value)
                    {
                        csTree.ParenID = (int)reader["parentNodeID"];
                    }
                    ListTree.Add(csTree);
                }
                con.Close();
                int i;
                for (i = 0; i < ListTree.Count; i++)
                {
                    if (ListTree[i].ParenID == 0)
                    {
                        TreeNode rootNode = new TreeNode();
                        rootNode.Text = ListTree[i].Name + ",子节点数:0";//默认的子节点数量为0
                        rootNode.Tag = ListTree[i];
                        treeView1.Nodes.Add(rootNode);
                        addNodes(rootNode);//调用递归方法
                    }
                }        
            }
            private int addNodes(TreeNode node)//参数为父节点
            {
                int count = 0;
                int childCount = 0;
                classTree csTr = (classTree)node.Tag;            for (int i = 0; i < ListTree.Count; i++)
                {
                    if (csTr.ID == ListTree[i].ParenID)
                    {
                        ++count;                                     
                        TreeNode childNode = new TreeNode();
                        childNode.Text = ListTree[i].Name + ",子节点数:0";
                        childNode.Tag = ListTree[i];
                        node.Nodes.Add(childNode);//添加子节点
                        childCount+=addNodes(childNode);//在这里递归,返回子节点的所有子节点数量
                    }                
                }
                node.Text = csTr.Name + ",子节点数:" + Convert.ToString(childCount + count);//给父节点赋值
                csTr.KidCount = childCount + count;
                node.Tag = csTr;
                return childCount + count;//返回父节点的所有子节点数量
            }