gpt4 book ai didi

mvvm - 初始化 View 模型

转载 作者:行者123 更新时间:2023-12-03 10:11:17 25 4
gpt4 key购买 nike

关于 MVVM 的一些事情让我继续感到困惑——如果我使用 View 优先的方法来构造我的对象(这似乎是最常见的方法,至少在大量阅读和搜索之后),我如何将上下文信息获取到 View 模型中?

我已经看到很多类似问题的答案都说“使用 DI 容器注入(inject)你的模型”,但这对我没有帮助,所以我将提供一个小例子。

假设我的应用程序是 PeopleEditor。它用于加载和编辑复杂的 People 对象。当您加载应用程序时,您会看到一个主屏幕,它将一堆人加载到内存中 - 假设所有这些都可以通过我可以从我的容器中获取的集合进行访问。通过单击一个人,您将进入编辑器屏幕。编辑器很复杂,所以这不是在一个屏幕中实现的简单的主从 View 。

所以,在主屏幕上,当我点击一个人时,应用程序需要创建一个新的 View 和 View 模型并显示 View 。如果我首先创建 View 模型,无论是否通过容器,我都可以使用适当的人员对象对其进行初始化。 这对我来说似乎很自然,所以我很难弄清楚为什么 View 优先似乎是主要模式。 我将如何使用 View 优先的方法来做到这一点? View 将创建 View 模型,该模型可以访问 People 集合,但不知道其编辑的是哪个人。为清楚起见进行编辑:多人编辑可以同时存在,每个编辑不同的人。

Prism 4.0 alpha 的 MVVM 引用实现使用“状态处理程序”,它基本上是应用程序用来在容器中存储构造函数参数的服务。它保存状态并调用 ShowView,最终创建的 View 模型导入状态对象。这对我来说似乎很笨拙——就像它试图假装它是松散耦合的,而实际上并非如此。还有其他人有其他指导吗?

最佳答案

拉沃克,

我不是专家,但我对 View-First 和 Model-First 的了解是:

  • View-First:查看程序 ViewModel,您创建 View 然后自动创建 View 模型。
  • Model-First:ViewModel 程序 View,您在根应用程序中创建 ViewModel 对象图,将其分配给 Root View 数据上下文。然后让 View 渲染其相关 subview 取决于 View 模型。

  • 并不是说 Model-First 方法不好,但是我更喜欢 View-First 方法,因为 viewmodel 可以位于代码后面,所以当某些进程需要非绑定(bind)友好任务(PasswordBox、DialogConfirmation、ClosingForm 等)时,我可以编写我在代码后面的逻辑。

    无论如何,为了解决这个问题,我通常使用 IOC 和 Event Aggregator 的组合。这里是:
  • 对于 viewmodel 需要上下文信息,在 IOC 容器中注册其实例而不是其类型。所以即使它的观点没有,它也准备好了。
  • 当导航操作发生时(通过单击人员列表项),使用 IOC 容器解析器解析您的 View 。并使用指定参数向导航总线发送事件。此外,此事件将被目标 ViewModel 捕获并执行某些操作。

  • 注册 viewmodel 的实例并不是真正必要的。只是为了确保在前一个 View 模型调度事件时 View 模型已准备就绪。

    更新

    but then to populate it with any kind of local context I need to use a global facility to send it an event?



    在您的情况下,上下文对象不是本地的,而是在对象调用之间传递的消息。显然,在您的模型优先方法中,您可以:
    //selectedPeople is contextual object
    myPeopleDetailVM.LoadData(selectedPeople)

    当你通过 selectedPeople 时,它几乎是一样的。到事件总线的论点。

    如果您考虑性能,则可以将其与 WPF Routed Event System 进行比较在这种情况下,路由策略比事件总线更复杂,我认为如果您对使用 WPF 路由事件比使用事件聚合器有足够的信心。

    如果您使用内置框架事件聚合器(prism,mvvmlight),我看到的唯一问题是,您的 View 模型被事件总线污染,如果您提示这一点,那么我同意您的看法。

    希望有所帮助。

    关于mvvm - 初始化 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615302/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com