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

时间:2009-08-19 21:43:49

标签: silverlight silverlight-3.0 treeview drag-and-drop wcf-ria-services

我正在使用.Net RIA服务的7月'09 CTP,并将Group => Department => Category对象的对象绑定到树视图,然后使用hierarchyialdatatemplate渲染三个对象中的每一个类型。

我的最终目标是启用拖放功能,以便我可以快速编辑我的群组列表=> departmentsments =>类别,并以更直观的方式更改各自的关系以前可用的。

我当前的问题是,当我执行drop命令并提交需要提交到数据上下文的更改时,我的树视图正在重绘,并折叠了叶子。有没有一种方法可以用来避免崩溃?

2 个答案:

答案 0 :(得分:3)

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

你需要2个名单:

  1. 一个用于包含从服务接收的数据(称为sourceList)
  2. 一个用于包含要与treeView绑定的显示(DisplayList)的根条目。
  3. 您还必须确保Load操作的LoadBehaviour设置为Merge。 例如:

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

    所以现在剩下的就是在每次更新后调用你的domainContext.Load并在你的CallbackFunction中用你的Web服务返回的新实体列表替换你的sourceList。由于您的显示列表的向下钻取条目依赖于关联和分层数据模板,因此它仍应在刚刚编辑的条目上展开。

    注意如果从头开始重建DisplayList,树视图显然会重绘\折叠。

    希望这有助于某人。 扬

答案 1 :(得分:0)

我没有做过很多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;
    }
}