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

 

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

转载于:https://www.cnblogs.com/oliverxgwang/archive/2009/06/23/1509646.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值