C#中的TreeView:已检查的子节点不会保持检查状态,并且无法使用ref参数

时间:2014-07-25 13:44:54

标签: c# wpf tree treeview

我正在尝试使用几种方法在C#中扩展TreeView以填充树并检查子节点。但是,我遇到了一个设计问题,我无法访问实际的TreeView节点来检查它们。

方法PopulateTree()按预期工作,并且从WPF成功调用CheckBoxesBelow()。

enter image description here

private void BusinessUnitsForm_Load(object sender, EventArgs e)
        {
            busUnitTreeView.PopulateTree(busUnitTreeView.GetTreeItems("BU"));
        }

// a box is checked, so recursively check all boxes below
private void busUnitTreeView_AfterCheck(object sender, TreeViewEventArgs e)
  {
       busUnitTreeView.CheckBoxesBelow(sender,ref e);      
  }

但是,关闭菜单后节点不会保持检查状态。这是因为节点是在本地创建的,并没有引用原始Tree的节点。但是,我无法在其中添加“ref”或发生以下错误:

A property or indexer may not be passed as an out or ref parameter

查看同一错误上的多个线程,看起来我必须创建新对象并返回它们,然后将原始对象设置为新对象。这似乎不是一个非常优雅的解决方案。

// used to check all sub boxes of a node
        public void CheckBoxesBelow(object sender,ref TreeViewEventArgs e)
        {
            if (busy) return;
            busy = true;
            try
            {
                CheckNodes(e.Node, e.Node.Checked);
            }
            finally
            {
                busy = false;
            }
        }

        private void CheckNodes(TreeNode node, bool check)
        {
            foreach (TreeNode child in node.Nodes)
            {
                child.Checked = check;
                CheckNodes(child, check);
            }
        }

对于如何检查Tree的节点,是否有更好的解决方案?在C ++中,使用指针很容易,但我在这里不知道如何做到这一点。

由于

1 个答案:

答案 0 :(得分:1)

您确实需要使用DataBinding来实现此目的。这将解决您的所有问题。在busUnitTreeView_AfterCheck事件处理程序中,您只需从发送方的DataContext中检索基础数据结构,并在所有子节点中将您想要的属性设置为true或false。