我正在接受一个包含Prism& amp;的WPF应用程序。 MEF并试图更好地理解MVVM模式。我以前做过这个,虽然我有一个我很满意的工作解决方案,但我不相信我坚持MVVM模式,因为我最终得到了暴露很多事件处理程序和后面的代码的视图模型处理这些事件的观点。这些事件的主要目的是根据初始视图中的选择打开其他视图(例如编辑对话框)。
到目前为止(这次)我已经使用PRISM创建了一个shell应用程序,我有一些区域,我可以创建视图并将它们添加到这些区域。我也使用MEF来模块化解决方案,并通过IoC自动为视图提供视图模型。再次,这是有效的 - 一点......
我的问题是创建了一些视图模型。到目前为止,我已经创建了包含数据库列表的模型。这些工作到目前为止我所拥有的代码最多的是带有[ImportingConstructor]属性的附加构造函数,可以确保我获得视图模型。我暂时对此感到满意(但可能会在稍后查看选项)。
我的下一步是提供一个新视图来编辑其中一个列表中的项目(这基本上是打开编辑对话框的经典主列表)。这是我无法看到MVVM / MEF做事的方法 - 我找不到根据列表中当前选定的项目将参数传递给视图模型构造函数的方法。
我知道我想在这里成为一名纯粹主义者。我也知道背后的代码没有任何问题。然而,我试图看看乌托邦实施是否真的可以实现。
那么,你会怎么做......
给定一个列表,使用选定的项目,打开一个新视图(InteractionRequest?),其视图模型包含(a)列表中选择的实际项目或(b)至少某种类型的引用或它的一个属性可用于从数据存储中再次检索项目吗?
答案 0 :(得分:0)
这不是你问题的直接答案,但MEF不是为IoC创建的,尽管它似乎承担了相当多的角色。我认为在您的情况下,您需要一个真正的IoC容器。
我通常做的(使用Unity)要么创建一个子容器,要使用ContainerControlledLifetimeManager(在Unity中表示容器将始终注册)使用子容器注册我想要提供给视图模型的类的实例当被问及时返回相同的实例)。我经常在其他事情发生在树下时做这件事。可以这么说,需要相同的类实例。
另一种技术是使用参数覆盖,它指示统一通过此名称"将此值提供给构造函数参数"。这个问题似乎在这里告诉你如何用MEF做到这一点:MEF Constructor Injection
我认为你已走上正轨,老实说,我会考虑摆脱MEF并使用真正的IoC容器。
你是对的,你可能无法在现实世界的应用程序中实现100%纯MVVM实现。我有一个非常大的WPF应用程序,并且在某些地方,通常只有当你进入简单的对话框和弹出窗口时,它才对MVVM没有意义。&#34;。< / p>
答案 1 :(得分:0)
我会在这里回答你的问题:
以MVVM方式处理弹出窗口/等等 - 检查各种交互实现。基本上,您已将Behavior
附加到XAML并绑定到VM上的某些服务。
要在构建VM之后处理的其他操作 - 通常在VM上使用Start()
方法并在VM构建后立即在视图中调用它。
要在视图之间传递参数 - PRISM有INavigationAware
,您可以在视图之间传递简单的查询字符串
到目前为止,我发现我可以使用MVVM方式执行大多数,并转到自定义控件中的事件/等。我还实现了很多行为以保持MVVM