【问题标题】:ViewModel constructorsViewModel 构造函数
【发布时间】:2012-03-23 19:54:57
【问题描述】:

我正在尝试一个包含 Prism 和 MEF 的 WPF 应用程序,并试图更好地理解 MVVM 模式。我以前做过这个,虽然我有一个我很满意的工作解决方案,但我不相信我会忠于 MVVM 模式,因为我最终得到的视图模型暴露了很多事件处理程序和背后的代码处理这些事件的视图。这些事件的主要目的是根据初始视图中的选择打开其他视图(例如编辑对话框)。

到目前为止(这次)我已经使用 PRISM 创建了一个 shell 应用程序,我有一些区域,我可以创建视图并将它们添加到这些区域。我还使用 MEF 将解决方案模块化,并通过 IoC 自动将视图模型提供给视图。再次,这有效 - 在一定程度上......

我的问题是创建一些视图模型。到目前为止,我已经创建了包含数据库列表的模型。这些工作以及到目前为止我拥有的大多数代码是和具有 [ImportingConstructor] 属性的附加构造函数,以确保我获得视图模型。目前我对此感到满意(但稍后可能会查看选项)。

我的下一步是提供一个新视图来编辑其中一个列表中的项目(这基本上是一个打开编辑对话框的经典主列表)。这是我看不到 MVVM/MEF 做事方式的地方 - 我找不到基于列表中当前选定项将参数传递给视图模型构造函数的方法。

我知道我想在这里成为一个纯粹主义者。我也知道后面的代码没有错。不过,我想看看乌托邦式的实现是否真的可以实现。

那么,你会怎么做呢……

给定一个带有选定项目的列表,打开一个新视图(InteractionRequest?),其视图模型包含(a)列表中选择的实际项目或(b)至少某种对它的引用或可用于从数据存储中再次检索项目的属性之一?

【问题讨论】:

    标签: .net wpf mvvm prism mef


    【解决方案1】:

    这不是您问题的直接答案,但 MEF 不是为 IoC 创建的,尽管它似乎承担了相当多的角色。我认为在你的情况下,你需要一个真正的 IoC 容器。

    我通常做的(使用 Unity)要么创建一个子容器,然后使用 ContainerControlledLifetimeManager(在 Unity 中意味着容器将始终询问时返回相同的实例)。我通常会在“树下”的其他事情可以说需要相同的类实例时这样做。

    另一种技术是使用参数覆盖,它指示unity“通过此名称将此值提供给构造函数参数”。这个 SO 问题似乎告诉您如何使用 MEF 执行此操作:MEF Constructor Injection

    我认为您走在正确的轨道上,老实说,我会考虑摆脱 MEF 并使用真正的 IoC 容器。

    虽然您是对的,但您可能无法在现实世界的应用程序中实现 100% 纯 MVVM。我正在处理一个非常大的 WPF 应用程序,并且在某些地方执行 MVVM 没有意义,通常是当您进入简单的对话框和“弹出窗口”时。

    【讨论】:

    • 编码大猩猩:感谢您这么快的回答。我查看了您引用的 SOQ,老实说,我不确定我是否理解所提供的答案。我想我需要仔细看看 CompositionContainer 并看看它在哪里适合,因为我还没有尝试使用它。我也接受你们关于使用 Unity 而不是 MEF 的 cmets;我第一次尝试这样做时就看到了这个,但最后还是选择了 MEF——自从人们告诉我他们更喜欢 Unity 以来。是的,弹出窗口是我最大的问题!
    【解决方案2】:

    我会在这里尝试回答你的问题:

    1. 要以 MVVM 方式处理弹出窗口/等 - 检查各种交互实现。基本上,您将 Behavior 附加到 XAML 并绑定到 VM 上的某些服务。

    2. 在构建 VM 之后处理其他操作 - 通常在 VM 上使用 Start() 方法并在 VM 构建后立即在您的视图中调用它。

    3. 在视图之间传递参数 - PRISM 有INavigationAware,您可以在视图之间传递简单的查询字符串

    到目前为止,我发现我可以大部分以 MVVM 方式进行操作,并在自定义控件中访问事件/等。我还实现了很多行为来保持 MVVM

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2022-01-20
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多