【问题标题】:Keep TreeView Subtree expanded after dataset refresh数据集刷新后保持 TreeView 子树扩展
【发布时间】:2009-08-19 21:43:49
【问题描述】:
我正在使用 .Net RIA 服务的 09 年 7 月 CTP,并将 Group=>Department=>Category 对象的对象绑定到树视图,然后让 hierarchialdatatemplate 呈现三种对象类型中的每一种。
我的最终目标是启用拖放功能,以便我可以快速编辑我的组列表=>部门=>类别,并以比以前更直观的方式更改它们各自的关系以前可用。
我当前的问题是,当我执行 drop 命令并提交需要提交到数据上下文的更改时,我的树视图正在重绘并折叠叶子。有什么方法可以避免倒塌吗?
【问题讨论】:
标签:
silverlight
silverlight-3.0
treeview
drag-and-drop
wcf-ria-services
【解决方案1】:
我发布这个答案纯粹是为了那些偶然发现这个帖子寻找答案的人。 (在 SL4 中完成)
您需要 2 个列表:
- 一个包含从服务接收到的数据(称为sourceList)
- 一个包含要显示的根条目 (DisplayList),您的 treeView 绑定到该条目。
您还必须确保您的 Load 操作将其 LoadBehaviour 设置为 Merge。
例如:
domainContext.Load(domainContext.GetEntityQuery(), LoadBehavior.MergeIntoCurrent, CallbackFunction, userState);
所以现在剩下的就是在每次更新后调用 domainContext.Load 并在 CallbackFunction 中将 sourceList 替换为 Web 服务返回的新实体列表。由于您的显示列表的向下钻取条目依赖于关联和分层数据模板,因此它仍应在刚刚编辑的条目上展开。
注意如果您从头开始重建 DisplayList,则树视图显然会重绘\折叠。
希望这对某人有所帮助。
一月
【解决方案2】:
我没有做过很多 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;
}
}