Mvvm 在Prism(CAL)中,如何注册PresenterWithRegion而不是RegisterViewWithRegion

Mvvm 在Prism(CAL)中,如何注册PresenterWithRegion而不是RegisterViewWithRegion,mvvm,prism,composite,mvp,Mvvm,Prism,Composite,Mvp,我在Prism应用程序中有一个模块,在其初始化方法中,我想注册一个演示者,而不是一个区域视图,即我想这样做: 伪代码: 而不是像这样加载视图: regionManager.RegisterViewWithRegion( "MainRegion", typeof(Views.EditCustomerView)); public SetupRibbonTabPresenter(ISetupRibbonTabView view) { this.view = view; }

我在Prism应用程序中有一个模块,在其初始化方法中,我想注册一个演示者,而不是一个区域视图,即我想这样做:

伪代码:

而不是像这样加载视图:

regionManager.RegisterViewWithRegion(
        "MainRegion", typeof(Views.EditCustomerView));
public SetupRibbonTabPresenter(ISetupRibbonTabView view)
{
    this.view = view;
}
演示者当然会带来自己的视图,并最终在该区域中注册该视图,但这将允许我将演示者绑定到演示者构造函数中的视图,而不是在XAML中将两者绑定在一起(这更像是一种解耦的MVVM模式,我希望在此避免)

如何将演示者添加到区域而不是视图?

namespace Client.Modules.CustomerModule
{
    [Module(ModuleName = "CustomerModule")]
    public class CustomerModule : IModule
    {
        private readonly IRegionManager regionManager;

        public CustomerModule(IRegionManager regionManager)
        {
            this.regionManager = regionManager;
        }


        public void Initialize()
        {
            regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.EditCustomerView));
        }
    }
}

我对Prism还是很陌生,但据我所知,这是没有意义的:区域是用来容纳视图的,不是吗。这就是他们存在的目的。您希望从您所在的地区获得哪些演示者可以使用的内容

鉴于演示者了解您的视图的所有信息,您能否在RegisterViewWithRegion调用中使用演示者:

regionManager.RegisterViewWithRegion(
    "MainRegion", typeof(Presenters.EditCustomerPresenter.View));

我对Prism还是很陌生,但据我所知,这是没有意义的:区域是用来容纳视图的,不是吗。这就是他们存在的目的。您希望从您所在的地区获得哪些演示者可以使用的内容

鉴于演示者了解您的视图的所有信息,您能否在RegisterViewWithRegion调用中使用演示者:

regionManager.RegisterViewWithRegion(
    "MainRegion", typeof(Presenters.EditCustomerPresenter.View));

我认为你的演讲者应该负责在他们被激活时将他们插入区域。我通常为我的演示者创建一个IViewRegistry,以避免他们知道区域名称,并让他们的演示者使用它来显示视图

public class MyViewPresenter : IPresenter
{
     IViewRegistry _viewReg;
     IUnityContainer _container;
     public MyViewPresenter(IViewRegistry viewRegistry, IUnityContainer container)
     {
          _viewReg = viewRegistry;
          _container = container;
     }

     void IPresenter.Present()
     {
          MyView view = _container.Resolve<MyView>();
          MyViewViewModel vm = _container.Resolve<MyViewViewModel>();
          view.DataContext = vm;

          _viewReg.ShowInMainRegion(view);
     }

}
您可以做一些更像您想要的事情(可能是检测
IViewFactory
的区域适配器),但这可能不实用

希望这有帮助,
Anderson

我认为您的演示者应该负责在激活时将其插入该区域。我通常为我的演示者创建一个IViewRegistry,以避免他们知道区域名称,并让他们的演示者使用它来显示视图

public class MyViewPresenter : IPresenter
{
     IViewRegistry _viewReg;
     IUnityContainer _container;
     public MyViewPresenter(IViewRegistry viewRegistry, IUnityContainer container)
     {
          _viewReg = viewRegistry;
          _container = container;
     }

     void IPresenter.Present()
     {
          MyView view = _container.Resolve<MyView>();
          MyViewViewModel vm = _container.Resolve<MyViewViewModel>();
          view.DataContext = vm;

          _viewReg.ShowInMainRegion(view);
     }

}
您可以做一些更像您想要的事情(可能是检测
IViewFactory
的区域适配器),但这可能不实用

希望这有帮助,
Anderson

您可以尝试使用RegisterViewWithRegion重载,该重载接受委托而不是视图类型

例如:

regionManager.RegisterViewWithRegion(RegionNames.APPLICATION_MANAGEMENT_REGION, OnGetManagementView);

public object OnGetManagementView()
{
     return m_managementViewModel.View;
}

这将允许您拥有自己的自定义逻辑来创建视图/视图模型(又名presenter)。找到指定区域时将调用回调。

您可以尝试使用RegisterViewWithRegion重载,该重载接受委托而不是视图类型

例如:

regionManager.RegisterViewWithRegion(RegionNames.APPLICATION_MANAGEMENT_REGION, OnGetManagementView);

public object OnGetManagementView()
{
     return m_managementViewModel.View;
}

这将允许您拥有自己的自定义逻辑来创建视图/视图模型(又名presenter)。找到指定区域时将调用回调。

我的方法是通过向区域传递已解析演示者的view属性来注册视图

this.regionManager.RegisterViewWithRegion(
    FoundationToolkitRegionNames.RIBBON_REGION, 
    () => this.container.Resolve<SetupRibbonTabPresenter>().View);

视图和presenter之前都已在容器中注册。

我的方法是通过向区域传递已解析presenter的view属性来注册视图

this.regionManager.RegisterViewWithRegion(
    FoundationToolkitRegionNames.RIBBON_REGION, 
    () => this.container.Resolve<SetupRibbonTabPresenter>().View);

视图和演示者之前都已在容器中注册。

有任何反馈吗?我们在这里做得怎么样?有什么反馈吗?我们在这里过得怎么样?