【问题标题】:In wpf treeview, how to redraw the nodes with their previous expanded values(using MVVM)在 wpf 树视图中,如何使用其先前的扩展值重绘节点(使用 MVVM)
【发布时间】:2011-01-12 21:38:02
【问题描述】:

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

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

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

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

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

谢谢
派佳

【问题讨论】:

    标签: wpf mvvm treeview refresh gridviewcolumn


    【解决方案1】:

    如果您还没有,请阅读 Josh Smith 的这篇精彩文章:Simplifying the WPF TreeView by Using the ViewModel Pattern

    他的建议基本上是在你的虚拟机中包含一个名为IsExpanded 的属性并将TreeView 正确绑定到它,以便展开/折叠状态完全由程序员控制。

    【讨论】:

    • 谢谢Aviad,我看到了这篇文章。我想做类似的事情是一个可行的选择......非常感谢。
    【解决方案2】:

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

    谢谢, 贾格德夫·乔桑

    【讨论】:

    • 感谢您的建议。是的,我认为这是其中一种方式。但我只是想知道这是否是正确的方法?困扰我的是模型和 UI 有时可能存在一些不匹配。这是其他人都遵循的一般模式吗?或者这种情况不是那么普遍。谢谢。
    • 不会出现不匹配的情况,因为两者会绑定在一起。用户界面将完美地代表您的视图模型。它们将保持同步。
    【解决方案3】:

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

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

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

    附:我有没有提到它有点过分重新创建树视图?

    【讨论】:

    • 感谢您的深思熟虑。所以看起来普遍的看法就像[jagdev josan]说的,分别更新Model和Treeview。我可以理解您为什么讨厌“重新创建树视图”的想法!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多