首先,我是MVVM的新手,所以请帮助我:)
假设我的应用程序中有多个视图。在我的例子中,我有一个编辑器视图和一个浏览器视图。它们都必须与我正在编辑的"节点"的视图模型一起工作。
那么视图模型实际上是在哪里创建的呢?
假设编辑器被告知编辑某个节点-它可以创建一个新的"NodeViewModel"并使用它。但同时,有一个NodeBrowserView,它允许人们快捷选择不同的节点。基本上-我需要EditorView与BrowserView相同的ViewModel一起工作,所以我需要一个通用的"GetViewModelfor(X)"方法。
那么这应该是如何工作的呢?:)
欢呼:)
您的编辑器视图和浏览器视图应该在某种NodeViewModel
上运行。你不应该仅仅为了不同的视图场景而需要单独的视图模型。
现在,您可以编辑尚未显示到用户的节点吗?如果没有(例如,用户决定编辑什么),应该在视图模型的内容第一次需要呈现给用户时创建视图模型。在大多数情况下,这将在一些浏览器/详细信息视图,这样用户可以选择元素和,然后选择编辑它。
编辑:
关于你的评论。编辑器视图应该提供NodeViewModel
。
提供的部分可以通过构造函数注入或手动设置视图的数据上下文来完成。例如,当用户浏览浏览器视图中的所有节点时,他可以双击列表项,编辑器视图将弹出:
// 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();
}
或者,如果你想避免CompositeView
和EditorView
之间的这种强耦合,你总是可以使用事件,但这并不总是必要的。
我在设计方面考虑的另一件事是添加额外的视图模型,称之为NodesListViewModel
。程序流可能是什么样的:
- 在应用程序启动时,获取节点(从DB,文件,服务,任何)
- 创建
NodeListViewModel
的实例,它依赖于IList<Node>
(节点实体列表) -
NodeListViewModel
将构建和公开NodeViewModel
元素的集合 创建主程序窗口的实例,它使用复合视图。它需要 - 当用户决定他需要编辑的项目,它都准备好了。浏览器有所有
NodeViewModels
的列表,它可以很容易地拾取当前并将其传递给专用视图。
NodeListViewModel
作为其数据上下文。在这种情况下,我更喜欢使用一个单一的主视图模型,并有一个"当前项目"的视图连接代替。这比每次用户单击不同的节点/网格行等时传递/创建新的视图模型要容易得多。当相同的操作可以在整个视图模型中实现时,我真的认为不需要单独的视图模型。它降低了复杂性,减少了创建对象(视图模型)的更改,并减少了由于对它们的引用直到应用程序关闭才释放而使它们挂起的更改。