我正在尝试使用几种方法在C#中扩展TreeView以填充树并检查子节点。但是,我遇到了一个设计问题,我无法访问实际的TreeView节点来检查它们。
方法PopulateTree()按预期工作,并且从WPF成功调用CheckBoxesBelow()。
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 ++中,使用指针很容易,但我在这里不知道如何做到这一点。
由于
答案 0 :(得分:1)
您确实需要使用DataBinding来实现此目的。这将解决您的所有问题。在busUnitTreeView_AfterCheck事件处理程序中,您只需从发送方的DataContext中检索基础数据结构,并在所有子节点中将您想要的属性设置为true或false。