在哪里创建/获取/缓存ViewModels?

时间:2011-11-20 02:00:04

标签: c# wpf mvvm viewmodel

首先,我是MVVM的新手,所以请帮我解决这个问题:)

假设我的应用中有多个视图。在我的例子中,我有一个编辑器视图和一个浏览器视图。 它们都必须使用我正在编辑的“节点”的视图模型。

那么viewmodel实际上是在哪里创建的?

假设编辑被告知编辑某个节点 - 它可以创建一个新的“NodeViewModel”并使用它。但与此同时,还有一个NodeBrowserView,它允许人们快捷方式选择不同的节点。 基本上 - 我需要EditorView使用与BrowserView相同的ViewModel,所以我需要一个通用的“GetViewModelfor(X)”方法。

那么这应该是怎么回事? :)

干杯:)

2 个答案:

答案 0 :(得分:1)

您的编辑器视图和浏览器视图都应该在某种NodeViewModel上运行。您不应该仅针对不同的视图场景使用单独的视图模型。

现在,您可以编辑尚未显示的用户节点吗?如果否(如用户决定编辑的内容),则应在第一次将其内容呈现给用户时创建视图模型。在大多数情况下,这将在某些浏览器/详细信息视图中,以便用户可以选择元素,然后选择编辑它。

修改

关于你的评论。应为编辑器视图提供NodeViewModel

提供部分可以通过constructor injection或手动设置视图的数据上下文来完成。例如,当用户浏览浏览器视图中的所有节点时,他可以双击列表项并弹出编辑器视图

// this will probably be done in response to event
private void ListItemDoubleClick(object sender, EventArgs e)
{
    NodeViewModel currentItem = // extract current list item
    EditorView editorView = new EditorView(currentItem);
    editorView.Show();
}

或者,如果你想避免CompositeViewEditorView之间的这种强耦合,你总是可以使用事件,但并不总是必要的。

我在设计方面考虑的另一件事是添加额外的视图模型,称之为NodesListViewModel。程序流程可能如下:

  1. 在应用程序启动时,获取您的节点(无论是来自数据库,文件,服务还是其他任何内容)
  2. 创建NodeListViewModel的实例,该实例依赖于IList<Node>(节点实体列表)
  3. NodeListViewModel将构建并公开NodeViewModel元素
  4. 的集合
  5. 创建主程序窗口的实例,该窗口使用复合视图。它需要NodeListViewModel作为其数据上下文。
  6. 每当用户决定他需要编辑项目时,它都准备好了。浏览器包含所有NodeViewModels的列表,它可以轻松获取当前值并将其传递给专用视图。

答案 1 :(得分:0)

在这种情况下,我更喜欢使用单个主视图模型,并且具有视图连接到的“当前项目”。每次用户单击不同的节点/网格行/等时,这样做更容易,而不是传递/创建新的视图模型。当真正实现相同的操作时,我真的看不到单独的视图模型。整体视图模型。它降低了复杂性并减少了创建对象(视图模型)的变化并使它们闲置,因为在应用程序关闭之前不会释放对它们的引用。