Mvvm 在Prism(CAL)中,如何注册PresenterWithRegion而不是RegisterViewWithRegion
我在Prism应用程序中有一个模块,在其初始化方法中,我想注册一个演示者,而不是一个区域视图,即我想这样做: 伪代码: 而不是像这样加载视图: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; }
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);
视图和演示者之前都已在容器中注册。有任何反馈吗?我们在这里做得怎么样?有什么反馈吗?我们在这里过得怎么样?