【问题标题】:How to switch view in MVVM using MEF如何使用 MEF 在 MVVM 中切换视图
【发布时间】:2010-06-25 05:41:33
【问题描述】:

我有一个单独的 Model 和 ViewModel 对象,并希望以编程方式创建 WPF 视图并将其附加到它们,一次一个。可以动态创建视图,例如通过选择菜单项(某处)。新创建的视图将丢弃查看 ViewModel 的任何旧视图。然后它将使自己成为该 ViewModel 的当前视图,将其显示在某个 WPF 窗口中,作为视图 UserControl 的容器。我将 MEF 用于 IoC。重要的是 Model 和 ViewModel 对象只创建一次。使用 MEF 完成此任务的方法是什么?

【问题讨论】:

    标签: mvvm mef


    【解决方案1】:

    您可以查看 WPF Application Framework (WAF)ViewModelWriter 示例应用程序。他们展示了如何使用 MVVM 和 MEF 切换视图。

    【讨论】:

    • 好的,我现在看到了:shellViewModel.ContentView = printPreviewViewModel.View;我的要求是保留现有的 ViewModel 对象并更改其视图的实例。我正在考虑是否从 WAF ViewModel 派生并添加 View 属性的设置器(目前它只有 get),或者由于 ViewModel 对象仍然是一个相当轻的对象,只需创建它的另一个实例。
    • WAF:有可能更多的 View 共享同一个 ViewModel 对象。使用第一个视图创建 ViewModel。然后检索其他视图(通过 MEF)并自己设置 DataContext 属性:在 ViewModel 构造函数中:view2.DataContext = this;
    • 有多个视图,但当时只有一个可用。可以设置其他视图。因此,在 ViewModel 中作为私有字段的第一个视图是一个问题,因为它会在 ViewModel 处于活动状态时坐在那里。为 ViewModel 的 View 属性设置一个受保护的 setter 并在其中附加 DataContext 不是更有意义吗?
    • 不,对于更一般的情况,这不是一个很好的解决方案。我猜 ViewModel 能够处理可修改的视图集合将是更通用的解决方案。当然,我并不是要求您更改 WAF 来满足一项特殊要求。只是大声思考。
    【解决方案2】:

    我在我的测试应用程序中使用视图模型优先方法。所以我通过 mef 实例化视图模型,然后 wpf + datatemplates 完成剩下的工作。我所要做的就是将我的实际视图模型绑定到 contentcontrol.content。 你说 ViewModel 对象只创建一次很重要。您可以通过 mef 和 creationPolicy.Shared 或 Lazy 导入来实现此目的。考虑到这一点,我认为 ViewModel-First 是您应该采用的方式。它很简单,您不需要额外的定位器或 wathever :)

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多