您的位置:首页 > 其它

在wpf开发中,使用prism的一些问题解决

2009-06-23 17:28 381 查看
最近,使用prism v8推荐的构建模式,搭建了使用wpf技术的Composite Application。现在总结一下。

一、 在prism中,它在主窗体使用了bootstrapper来初始化模块,引导Unity和Module运行。它这样做有一定的局限性:

l 在主窗体中,各模块的位置都固定,不能满足诸如同一个控件容器按照用户的要求,在运行中注入相应模块的设计需求。如果要求多个模块对应同一个RegionManager.RegionName,在载入模块的时候就会报错,而且,如果将注入的模块设置为InitializationMode.OnDemand,即使在注入的不会报错,但是在程序运行中,将view添加到Region中时,也会出错;

l 在RI的例子中,主窗体是窗体第一个启动的窗体,而实际项目中,第一个启动的往往不是主窗体。所以在第二层窗体中,模块中声明的RegionName就会出现找不到相应的占位RegionName的问题。

现把解决方法写出来,供以后参考:

将程序的第一个程序设置为引导程序,将程序的主程序列为其引导的程序。

protected override DependencyObject CreateShell()
{
OCSLoader shell = this.Container.Resolve<OCSLoader>();
shell.Show();

return shell;
}
protected override void InitializeModules()
{
IModule mainFrame = this.Container.Resolve<OCS.MainFrame.MainFrameModule>();
mainFrame.Initialize();

IModule tt = this.Container.Resolve<OCS.Query.QueryModule>();
tt.Initialize();

}

这段代码是bootstrapper中的引导代码,shell为引导程序,负责初始化Castle AR ,Logger和用户登录。并为主窗体提供容器。

InitializeModules函数中的语句是初始化模块,但是和RI中建议的方式不一样。

使用的时候,查询模块要和其他模块公用MainFrameModule中的一个Region,

private object view3 = null;
public object View3
{
get
{
if (null == view3)
{
QueryEditorPresentationModel projectsListPresenter = this.container.Resolve<QueryEditorPresentationModel>();
view3=projectsListPresenter.View;
}
return view3;
}
}

上面的代码中QueryEditorPresentationModel是quey窗体的presenter,

当用户要求注入到公用容器中时,使用下面语句

IRegion detailsRegion = regionManager.Regions["CommonRegion"];

detailsRegion.RemoveAllOtherControlsFromRegion();

detailsRegion.Add(View3,"789");

这样就满足了上面所示的设计需求。而且,各模块只被创建一次。

二、 prism项目中模块采用的M_V_VM模式,这种模式中,view和presenter的关系通过接口解耦,在模块引导类中,通过container.RegisterType函数注册到prism的container中,自动实例化窗体。这种做法可以很好的做到降低viewer和presenter的耦合,但是在实际的界面编写中,对于界面UIElement的绑定就有一定的困难,由于嵌套层次的问题,可能会找不到要绑定的presenter中的属性。解决这一问题的方法是采用下面的语句:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Query:QueryResultView}},Path=DataContext.GroupColumn}

以上的总结只是将问题提出和问题的解决说明了一下,以后再对其后面的原理说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐