首先,我是MVVM的新手,所以请帮我解决这个问题:)
假设我的应用中有多个视图。在我的例子中,我有一个编辑器视图和一个浏览器视图。 它们都必须使用我正在编辑的“节点”的视图模型。
那么viewmodel实际上是在哪里创建的?
假设编辑被告知编辑某个节点 - 它可以创建一个新的“NodeViewModel”并使用它。但与此同时,还有一个NodeBrowserView,它允许人们快捷方式选择不同的节点。 基本上 - 我需要EditorView使用与BrowserView相同的ViewModel,所以我需要一个通用的“GetViewModelfor(X)”方法。
那么这应该是怎么回事? :)
干杯:)
答案 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();
}
或者,如果你想避免CompositeView
和EditorView
之间的这种强耦合,你总是可以使用事件,但并不总是必要的。
我在设计方面考虑的另一件事是添加额外的视图模型,称之为NodesListViewModel
。程序流程可能如下:
NodeListViewModel
的实例,该实例依赖于IList<Node>
(节点实体列表)NodeListViewModel
将构建并公开NodeViewModel
元素NodeListViewModel
作为其数据上下文。NodeViewModels
的列表,它可以轻松获取当前值并将其传递给专用视图。答案 1 :(得分:0)
在这种情况下,我更喜欢使用单个主视图模型,并且具有视图连接到的“当前项目”。每次用户单击不同的节点/网格行/等时,这样做更容易,而不是传递/创建新的视图模型。当真正实现相同的操作时,我真的看不到单独的视图模型。整体视图模型。它降低了复杂性并减少了创建对象(视图模型)的变化并使它们闲置,因为在应用程序关闭之前不会释放对它们的引用。