【问题标题】:Pass Single Instance of Model to Multiple View Models in same Module for different views将模型的单个实例传递给同一模块中的多个视图模型以获取不同的视图
【发布时间】:2011-08-18 01:08:37
【问题描述】:

我正在使用 PRISM 开发一个项目,在该项目中,我将导航实现为树视图,并且任何点击事件都会发生使用事件聚合引发事件的注册模块,该模块具有多个视图的多个视图模型(如向导应用程序,您可以通过许多视图来收集数据)。我想要一个通用或共享或单例模型,可以在此视图模型中传递并在最后保存....用户可以随时单击任何导航的任何链接,它应该将数据保存到这个暴露的单例模型中通过不同的视图模型。您是否有任何正在执行此类操作的示例……或者您可以快速输入一个关于如何执行此操作的示例吗?或者根本不可能做到这一点。我正在遵循 Brian Lagunas 的 Pluralsight Video for PRISM 中的所有模式,因此请尝试使用这种方式....

【问题讨论】:

    标签: wpf mvvm prism


    【解决方案1】:

    我会有一个MasterViewModel 来控制“向导”页面和当前状态

    它将包含以下属性:

    • List<ViewModelBase> Pages
    • int CurrentPageIndex
    • ViewModelBase CurrentPage,返回Pages[CurrentPageIndex]
    • MyClass DataObject

    MasterViewModel 一起使用的MasterView 只不过是一个ContentControl,它的Content 绑定到CurrentPage。我可能还会在MasterView 中定义DataTemplates,它告诉WPF 使用哪个View 绘制哪个Page

    您的MasterViewModel 将负责处理页面,并向每个页面传递对其所需数据的引用。例如在构造函数中它可能会说,

    public MasterViewModel(MyClass dataObject)
    {
        DataObject = dataObject;
    
        Pages.Add(new InfoPage(DataObject));
        Pages.Add(new AddressPage(DataObject.Addresses));
        Pages.Add(new PhonePage(DataObject.Phones));
        Pages.Add(new SaveMyClassPage(DataObject));
    
        CurrentPageIndex = 0;
    }
    

    如果你有兴趣,我有一个例子here

    【讨论】:

      【解决方案2】:

      我不知道,是棱镜方式还是其他方式,当我构建类似向导的东西时,首先我创建向导收集的所有数据的实例。

      public WizardData wd = new WizardData();
      

      然后,向导的每一页都由这个wd实例初始化,即

      public FirstWizardPage(WizardData wd)
      {
          this.wizardData = wd;
      }
      

      因此,例如,这种方式允许您在每个页面上都有按钮 Finish。您可以使用wd 或其属性初始化您的ViewModel

      这种方式不是最好的。它是可能的方式之一。

      另一个 - 是创建单例并使用它而不需要从页面到页面传递引用。

      【讨论】:

        【解决方案3】:

        当您使用 Prism 时,您还拥有一个依赖注入容器,通常是 Unity 或 MEF。为了解决您的问题,您可以将您的模型注册为这些 DI 容器的单例。每个要求 DI 容器解决其依赖关系的视图模型,在我们的特殊情况下是模型,将从 DI 容器中获取单例实例。

        Unity 示例:您将模型注册为单例实例:

        public void Initialize( )
        {
            container.RegisterInstance<Model>(new Model(), new ContainerControlledLifetimeManager( ));
        }
        

        现在您可以在视图模型中解决依赖关系:

        public ViewModel(IUnityContainer container)
        {
            Model model = container.Resolve<Model>();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-21
          • 2012-01-25
          • 2021-12-26
          • 2020-04-09
          • 1970-01-01
          • 2014-06-28
          相关资源
          最近更新 更多