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

最近,使用prism v8推荐的构建模式,搭建了使用wpf技术的Composite Application。现在总结一下。

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

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;
            }
        }

 

上面的代码中QueryEditorPresentationModelquey窗体的presenter

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

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

 

            detailsRegion.RemoveAllOtherControlsFromRegion();

            detailsRegion.Add(View3,
"789");

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

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

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

 

以上的总结只是将问题提出和问题的解决说明了一下,以后再对其后面的原理说明。

posted on 2009-06-23 17:28  oliverPP  阅读(1529)  评论(1编辑  收藏  举报

导航