【问题标题】:Where to Create / Get / Cache the ViewModels?在哪里创建/获取/缓存 ViewModel?
【发布时间】:2011-11-20 02:00:03
【问题描述】:

首先,我是 MVVM 的新手,所以请帮帮我:)

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

那么视图模型实际上是在哪里创建的呢?

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

那么这应该如何工作? :)

干杯:)

【问题讨论】:

    标签: c# wpf mvvm viewmodel


    【解决方案1】:

    您的editor 视图和browser 视图都应该在某种NodeViewModel 上运行。您不应该只为不同的视图场景需要单独的视图模型。

    现在,您可以编辑 not-yet-shown-to-user 节点吗?如果不是(如用户决定编辑什么),则应在第一次需要将其内容呈现给用户时创建视图模型。在大多数情况下,这会出现在某些浏览器/详细信息视图中,以便用户可以选择元素并然后选择对其进行编辑。

    编辑

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

    providing 部分可以通过例如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. 创建依赖于IList<Node>NodeListViewModel 实例(节点实体列表)
    3. NodeListViewModel 将构建和公开 NodeViewModel 元素的集合
    4. 创建使用复合视图的主程序窗口的实例。它需要NodeListViewModel 作为其数据上下文。
    5. 每当用户决定他需要编辑项目时,一切就绪。浏览器有一个所有NodeViewModels的列​​表,它可以很容易地获取当前并将其传递给专用视图。

    【讨论】:

    • 如果我对您的理解正确,您就是正确的。 NodeViewModel 需要在第一次使用时创建,但当另一个视图需要它时,我需要该视图使用相同的视图模型。所以我的问题是 - 在 MVVM 模式中,视图模型的创建/缓存实际发生在哪里?一旦 Editor 决定要编辑某个节点,它就需要该节点的 NodeViewModel。如果 CompositionBrowser 已经在该节点上玩得开心,编辑器需要使用与 CompositionBrowser 相同的 NodeViewModel。那么他们都从哪里获得视图模型呢?
    • @IUsedToBeAPygmy:这是相当常见的通信相关场景,请参阅我的编辑。
    • 另一种选择是将 EditorView 指定为资源中的视图模型类型的 DataTemplate,并以视图模型作为内容弹出一个新窗口。其余的将是自动的。
    【解决方案2】:

    在这种情况下,我更喜欢使用单个主视图模型,并有一个视图连接到的“当前项”。这比每次用户单击不同的节点/网格行/等时都传递/创建新的视图模型要容易得多。当可以在整体视图模型。它降低了复杂性并减少了创建对象(视图模型)的变化,并且因为在应用程序关闭之前不会释放对它们的引用而使它们悬而未决。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2022-08-18
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多