2

我正在开发一个具有严格 MVVM 模式的 wpf 桌面应用程序。
目前我的应用程序正在做以下事情:

  • 显示带有 HierarchicalDataTemplate 的 Treeview。
  • 用户可以展开或折叠节点。
  • 用户可以添加添加新节点(拖放+双击)。
  • 每次添加新节点时,都会更新模型并根据模型重新创建 Treeview。
  • 因为重新创建了 Treeview,所以添加节点后所有节点都显示为展开状态。

我想显示具有先前扩展条件的节点。有没有办法使用 MVVM 做到这一点?到目前为止我的想法是

  • 模型不应包含任何与如何绘制 UI 相关的数据??
  • VM 应该只从模型中获取数据并将其放入 UI(并将日期从 UI 传递给模型)??

谢谢你的想法。我可能离铁路很远。但只是想从你们那里得到一些智慧。

谢谢
派佳

4

3 回答 3

2

如果您还没有,请阅读 Josh Smith 的这篇精彩文章:使用 ViewModel 模式简化 WPF TreeView

基本上,他建议IsExpanded在您的 VM 中包含一个调用的属性并将TreeView其正确绑定,以便展开/折叠状态完全由程序员控制。

于 2010-02-04T06:01:41.663 回答
1

我认为可能的一种解决方案是停止重新创建树,只需更新模型并将节点项添加到您要删除它们的当前节点。只需刷新模型中的集合,不要刷新树。如果这不适合您的建筑师,请告诉我们。

谢谢,贾格德夫·乔桑

于 2010-02-04T04:32:31.067 回答
0

视图模型可以包含视图相关信息,这就是它的用途。它是纯粹的商业和纯粹的观点之间的桥梁。我的视图模型通常会暴露一个对象的一些业务属性并添加一些相关的视图属性。如果您只需要业务属性,则直接绑定到业务层。只有当您需要做类似您的情况的事情时,您才需要一个视图模型。

如果您想完全重新创建树(这听起来很疯狂),您可以将节点的展开状态存储在视图模型中,并使用 ItemsContainerStyle 将它们绑定到树视图项。这样,当您重新创建树视图时,您之前展开的节点仍将被展开。

因此,您包装的业务对象将包含一个额外的属性 IsExpanded,您可以使用它来恢复您的树视图状态。

Ps 我有没有提到它有点过头来重新创建树视图?

于 2010-02-04T06:02:21.883 回答