简单示例: 我有具有分层项目结构的VM,我设计了包含TreeView的View。每个树节点对应于与模型中的一个相关的数据项。 GUI必须尊重用户首选项和设置并存储不同的参数,包括是否扩展每个特定节点。只要每个节点都与某些数据相关,我们就需要将View设置与Model联系起来。我相信,在代表模型的类中定义属性IsExpanded是不可行的。
那么我应该在哪里存储设置以使它们与数据保持一致?
答案 0 :(得分:3)
我认为在代表模型的类中定义属性IsExpaned并不行。
为什么呢?当模型链接到两个不同的树视图时会不会出现这种情况?
如果是这种情况,您当然可以创建一个“适配器视图模型”来包装模型并添加属性。请小心,因为技术很容易导致内存泄漏。
否则,将它放在模型中是完全可以接受的,特别是如果该模型专门用于提供该视图。与所有事情一样,从最简单,最务实的方法开始。
答案 1 :(得分:1)
我处于类似的情况,这就是我为解决它而采取的措施。
每个ViewModel节点都有一个IsExpanded属性,该属性绑定到TreeViewItem的IsExpanded属性。我不想通过将它存储在IsExpanded属性中的Model中来保持树的状态(这与视觉状态正确吗?)。因此,我让VM树结构生成一个字典,该字典针对从树中节点状态生成的字符串密钥存储每个节点的扩展状态:
Dictionary<string, bool> treeExpandedStates
树中的每个节点都有一个ID,所以在我的情况下,键是“/ 1/3/7”,但任何唯一的东西都可以。然后将此词典序列化为应用程序关闭的文件(实际上它是SerializableDictionary)。然后在应用程序重新启动时,它被反序列化并用于在重新加载层次结构后设置扩展状态。这意味着树的状态与用户离开时完全一样,但模型中没有存储任何内容。
答案 2 :(得分:0)
我认为这个问题是MVVM中常见的两难问题。我可以从两个方面来看待它。
在View,Model和ViewModel的分离中,您描述的内容位于模型中。你写的例如它需要存储。这并不意味着它与其他模型数据是模型的相同部分。
考虑以下分离:
像这样做分离可能并不那么容易,但关键是MVVM并不是要强迫你把所有东西放在同一个地方,我不认为MVVM阻止你为用户保留模型交互,与保留数据内容模型的方式相同。 Microsoft writes:
数据可能来自数据库,Web服务,命名管道,磁盘上的文件,甚至是载体鸽:它无关紧要。
为什么数据模型的数据不能来自用户的交互? :)
我对这些困境的常用方法是,像IsExpanded
这样的属性通常不需要在会话之间存储。这样,ViewModel中的属性具有默认值而不是存储值就足够了。 :)
如果需要存储,则不需要存储在模型中。 ViewModel用于呈现模型数据的逻辑。如果ViewModel想要保存其逻辑状态,则不必存储在模型中。
在我看来,你可以在不破坏MVVM模式的情况下以任何方式存储它。