代码之家  ›  专栏  ›  技术社区  ›  Richard B

在数据集刷新后保持TreeView子树扩展

  •  1
  • Richard B  · 技术社区  · 15 年前

    我正在使用.NET RIA服务的2009年7月CTP,并将group=>department=>category对象绑定到TreeView,然后使用HierarchicalDataTemplate呈现三种对象类型中的每一种。

    我的最终目标是要启用DRAG-N-DROP功能,这样我就可以快速编辑组列表= & Gt;部门= & GT类别,并以比以前可用的更直观的方式改变它们各自的关系。

    我当前的问题是,当我执行drop命令并提交需要提交到数据上下文的更改时,我的treeview将重新绘制和折叠叶子。有没有方法可以让我避免崩溃?

    2 回复  |  直到 13 年前
        1
  •  3
  •   JJ Small    13 年前

    我发布这个答案纯粹是为了那些偶然发现这个线索寻找答案的人。(在SL4中完成)

    您需要两个列表:

    1. 一个用于包含从服务接收到的数据(称为sourcelist)
    2. 其中一个包含要显示的根项(displaylist),TreeView绑定到该根项。

    还必须确保加载操作的loadbehavior设置为merge。 例如:

        domainContext.Load(domainContext.GetEntityQuery(), LoadBehavior.MergeIntoCurrent, CallbackFunction, userState);
    

    所以现在剩下的就是调用你的domaincontext.load每次更新后,在callback函数中用web服务返回的新实体列表替换你的sourcelist。由于显示列表的向下钻取项依赖于关联和分层数据模板,因此仍应在刚刚编辑的项上展开。

    注释 如果从头开始重建displaylist,treeview显然会重绘/折叠。

    希望这能帮助别人。 简

        2
  •  0
  •   eidylon    15 年前

    我没有做过很多silverlight的工作,但是从我所看到的情况来看,它的对象模型非常有限,所以可能没有一些事件/属性/方法来实现这一点。但你可以自己尝试保存/恢复状态…类似于以下伪代码的东西:

    private expandeds as collection();
    
    tree.OnNodeExpand() {
        expandeds.add(tree.CurrentNode.key);
    }
    
    tree.OnNodeCollapse() {
        expandeds.remove(tree.CurrentNode.key);
    }
    
    tree.AfterBind() {
        for each key in expandeds {
            tree.FindNodeByKey(key).expanded = true;
        }
    }
    
    推荐文章