2009-09-14 95 views
15

Composite WPF (Prism),向IRegionManger集合添加模块时,使用IRegion.Add和IRegionManager.RegisterViewWithRegion有什么区别?在Composite WPF(Prism)中,IRegion.Add和IRegionManager.RegisterViewWithRegion有什么区别?

IRegion.Add

public void Initialize() 
{ 
    _regionManager.Regions["MainRegion"].Add(new ModuleAView()); 
} 

IRegionManager.RegisterViewWithRegion

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView)); 
} 

回答

15
引发OnContentRegistered事件,但当然是不能的情况下

区别在于谁是负责任的e创建视图。在IRegion.Add方案(也称为查看注入)中,您负责事先实例化视图。在RegisterViewWithRegion(也称为查看发现)的另一场景中,区域管理器实例化视图本身。

有一些技术上的原因,你会想要做一个或另一个。例如

  • 你必须创建视图的一个更复杂的方式(也许你要创建的视图和视图模型,并通过设置DataContext属性自己嫁给他们),你需要使用View注射
  • 如果您利用Region Scopes,您将被迫使用View Injection。

相关documenation是: 对于视图合成(包括查看注射对比查看发现和查看优先或视图 - 演示 - 首先讨论的方法): http://msdn.microsoft.com/en-us/library/dd458944.aspx

还有一个非常方便“何时使用每个“部分。下面是从文档的摘录:

    创建视图和 显示,或者当你需要 从区域删除一个视图,用于 例如,作为一个结果,当过
  • 显式或编程控制逻辑应用 。
  • 要将多个相同视图的实例显示到一个区域中,其中每个视图实例 必须与 不同的数据绑定。
  • 要控制添加视图的区域的哪个实例(例如,对于 示例,如果要将 客户详细视图添加到特定的 客户详细信息区域)。请注意,此方案需要在此 主题中稍后介绍的范围 区域。

希望这会有所帮助。

+0

@安德森 - 你的回答确实有帮助。我的理解是IRegion.Add和IRegionManager.RegisterViewWithRegion都创建视图的具体实例并立即将其添加到IRegionCollection。无可否认,我只是站在CAG的立足点上。你能否给我一个更详细的例子?我已经完成了QuickStart和HowTos,但是我并没有完全掌握何时使用这些示例,因为示例在Imodule.Initialize方法中使用了它们,并且在示例中它们都没有任何不同之处。 – 2009-09-14 17:54:11

+0

不,与Add不同的是,您正在传入一个已经实例化的视图。使用RegisterViewWithRegion,您可以传入Type,Delegate或Object(实例化视图)。大多数时候,后者的超载不被使用。给我一下,我会指出你在文档的正确位置。 – 2009-09-14 18:09:05

+0

更新了链接到文档中的最佳资源,并且我抽出了什么时候使用视图注入与视图发现的官方语言。希望它比我的描述更清晰。 – 2009-09-14 18:19:58

2

RegisterViewWithRegion根据您的DI

+0

你能详细说一下吗?这不清楚。 – 2009-09-14 18:21:06

+0

当您使用括号运算符直接修改属性时,您不会引发事件,但当您调用其他方法时,您将同时获得修改后的集合和可以通知正在收听的任何人的事件 – slf 2009-09-14 20:05:45