Использование Presenter в Prism
Я разрабатываю приложение, используя PRISM в C# и WPF. Я новичок в этом и хотел бы реализовать Presenter. По сути, я хотел бы зарегистрировать докладчика вместо просмотра в моем модуле.
В настоящее время я делаю следующее в модуле Initialize:
iRegionManager.RegisterViewWithRegion("MainRegion", typeof(AboutWindow));
То, что я хотел бы, - я хочу иметь докладчика, я зарегистрирую докладчика в своем модуле. Этот докладчик должен отвечать за показ в моем регионе.
Я попытался прочитать несколько статей и примеров, но не смог получить именно то, что я хочу.
Псевдокод для моих требований выглядит следующим образом:
public class AboutModule : IAboutModule
{
IRegionManager iRegionManager = null;
IUnityContainer container = null;
public AboutModule(IRegionManager iRegionManager, IUnityContainer container)
{
this.iRegionManager = iRegionManager;
this.container = container;
}
public void Initialize()
{
//Register my presenter here.
}
}
internal class AboutModulePresenter : IAboutModulePresenter
{
private IAboutModuleView iAboutModuleView = null;
internal AboutModulePresenter(IAboutModuleView iAboutModuleView)
{
this.iAboutModuleView = iAboutModuleView;
}
public IAboutModuleView View
{
get
{
return this.iAboutModuleView;
}
}
public void ShowView()
{
//Register my view with region manager and display in the region.
}
}
2 ответа
Вы могли бы сделать это. По сути, вам придется сопоставить IAboutModuleView с AboutModuleView с любым контейнером IoC, который вы используете, например, Unity. Затем в вашем методе ShowView вы должны вызывать RegisterViewWithRegion для RegionManager, передавая представление.
Тем не менее, как и где бы вы построили свой докладчик? Кто будет отвечать за вызов ShowView()?
Я также рекомендовал бы взглянуть на шаблон MVVM (независимо от того, используете ли вы VM-first или View-first до вас), который довольно похож на MVP, но лучше подходит для приложений WPF и Silverlight.
Чтобы показать или скрыть вид в регионе, вы можете добавить или удалить вид самостоятельно:
void AddView()
{
IRegion region = this._regionManager.Regions["RegionName"];
object presentView = region.GetView( "ViewName" );
if ( presentView == null )
{
var view = _container.Resolve<View>( );
region.Add( view, "ViewName" );
}
}
void RemoveView()
{
IRegion region = this._regionManager.Regions["RegionName"];
object presentView = region.GetView( "ViewName" );
if ( presentView != null )
{
region.Remove( presentView );
}
}